ios / SecItemDelete不接受SecIdentityRef / kSecMatchItemList

时间:2012-05-09 12:39:33

标签: iphone ios x509 pki

通过CN删除Certs的简单方法(以前SecItemAdd从PKCS12导入中提供了证书);我收到了错误:

  

属性列表格式无效:200(属性列表不能包含'SecIdentity'类型的对象)

基于https://developer.apple.com/documentation/security/1395547-secitemdelete的地方我认为我遵循指示:

  

要删除由瞬态参考标识的项目,请指定   kSecMatchItemList搜索键,使用返回的引用   kSecReturnRef在之前的调用中返回类型键   SecItemCopyMatching或SecItemAdd函数。

信中写到了。代码如下:

NSDictionary * attributes;
NSString * cnString = @"/CN=foo";

attributes = [NSDictionary dictionaryWithObjectsAndKeys:
              (__bridge id)(kSecClassIdentity), kSecClass,
              cnString, kSecMatchSubjectContains,
              kSecMatchLimitAll, kSecMatchLimit,
              kCFBooleanTrue, kSecReturnRef,
              nil];

CFArrayRef result;
status = SecItemCopyMatching((__bridge CFDictionaryRef)(attributes), 
      (CFTypeRef *)&result);

if (status == noErr) {

    for(int i = 0; i < CFArrayGetCount(result); i++) {

        SecIdentityRef item = (SecIdentityRef) CFArrayGetValueAtIndex(result, i);
        NSLog(@"Item #%d: %@", i, item);

        attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                      (__bridge id)(kSecClassIdentity), kSecClass,
                      [NSArray arrayWithObject:(__bridge id)item], kSecMatchItemList,
                      kSecMatchLimitOne, kSecMatchLimit,
                      nil];

        status = SecItemDelete((__bridge CFDictionaryRef)(attributes));

        if (status != noErr || status != errSecItemNotFound)
            NSLog(@"Delete %d/%@failed: %ld (ignored)", i,item, status);
    };
};

控制台上的输出是:

 Item #0: <SecIdentityRef: 0xc7359ff0>

在查找之后直接(如果搜索扩大,我们会得到这些数组)。

然后从Security.dylib内部深处:

  

属性列表格式无效:200(属性列表不能包含'SecIdentity'类型的对象)

最终保释:

 Delete 0/<SecIdentityRef: 0xc7359ff0>failed: -50 (ignored)

我做错了什么?

2 个答案:

答案 0 :(得分:0)

这已在最新的GM下降中得到修复。现实与文档同步。

答案 1 :(得分:0)

引用头文件SecItem.h中的文档,它是安全框架的一部分:

  

默认情况下,此函数会删除与指定查询匹配的所有项目。   您可以通过指定以下其中一个键来更改此行为:

     
      
  • 要删除瞬态引用标识的项目,请在iOS上,   使用项引用指定kSecValueRef 在OS X上,给一个   kSecMatchItemList 包含项目参考。

  •   
  • 要删除持久性引用标识的项目,请在iOS上,   使用返回的持久引用指定kSecValuePersistentRef   使用kSecReturnPersistentRef键来SecItemCopyMatching或   SecItemAdd。 在OSX上,将kSecMatchItemList 与持久性引用一起使用   使用kSecReturnPersistentRef键返回   SecItemCopyMatching或SecItemAdd。

  •