通过CN删除证书的一种简单方法(证书以前由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)


我究竟做错了什么?

最佳答案

最新的GM版本已修复此问题。现在,现实与文档同步。

关于iphone - ios/SecItemDelete不接受SecIdentityRef/kSecMatchItemList,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10516295/

10-11 11:02