通过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)
我做错了什么?
答案 0 :(得分:0)
这已在最新的GM下降中得到修复。现实与文档同步。
答案 1 :(得分:0)
引用头文件SecItem.h
中的文档,它是安全框架的一部分:
默认情况下,此函数会删除与指定查询匹配的所有项目。 您可以通过指定以下其中一个键来更改此行为:
要删除瞬态引用标识的项目,请在iOS上, 使用项引用指定kSecValueRef 。 在OS X上,给一个 kSecMatchItemList 包含项目参考。
要删除持久性引用标识的项目,请在iOS上, 使用返回的持久引用指定kSecValuePersistentRef 使用kSecReturnPersistentRef键来SecItemCopyMatching或 SecItemAdd。 在OSX上,将kSecMatchItemList 与持久性引用一起使用 使用kSecReturnPersistentRef键返回 SecItemCopyMatching或SecItemAdd。