以编程方式从钥匙串mac中删除私钥

时间:2015-01-07 17:13:27

标签: objective-c macos security

我有一个p12文件,说mycert.p12有一些密码,我使用安全工具导入它,并按正常方式安装在钥匙串中,现在我试图从钥匙串中删除私人和公共entires,我能够删除公众使用delete-certificate -Z和安全工具,但私钥没有被删除,如何使用SecItemDelete删除这个或任何可用的特殊脚本。

由于

1 个答案:

答案 0 :(得分:1)

您可以使用SecItemCopyMatching和SecKeychainItemDelete来实现此目的。第一个搜索项目,第二个删除项目。

对于SecItemCopyMatching,您需要定义一个搜索字典,该字典定义您要查找的项目,例如,您可以使用要查找的密钥的钥匙串名称。作为一个例子,我有一个名为“iPhone配置实用程序(8AE57ABA-8DCD-4A29-9013-07FB2AEDADCE)”的私钥。

要以编程方式删除此特殊私钥,您可以使用以下代码段:

NSMutableDictionary *query = [NSMutableDictionary new];

[query setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[query setObject:@"iPhone Configuration Utility (8AE57ABA-8DCD-4A29-9013-07FB2AEDADCE)" forKey:(__bridge id)kSecAttrLabel];
[query setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnRef];
[query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];

CFTypeRef result = NULL;

OSStatus status = 0;

status = SecItemCopyMatching((__bridge CFDictionaryRef )query, &result);

NSLog(@"%@", SecCopyErrorMessageString(status, NULL));

SecKeychainItemDelete((SecKeychainItemRef)result);

字典中的第一个对象,键组合定义了您正在搜索私钥。如果您正在搜索证书,可以使用KSecClassCertificate,或者如果您要搜索密码,请使用KSecClassGenericPassword。

第二个使用KSecAttrLabel定义Keychain中项目的名称。

SecItemCopyMatching返回对找到的项的引用,3d定义引用的类型,此处为SecKeychainItemRef,因为此类型需要SecKeychainItemDelete。

第4个定义你只想要一个匹配,如果你想要所有匹配的项目,那么使用KSecMatchLimitAll。

然后调用SecItemCopyMatching并返回对搜索词典匹配的第一个找到项的引用。

SecCopyErrorMessageString会打印一条错误消息,您可以在其中查看是否正确,然后打印出“无错误”,或者如果找不到该项,则会收到“未找到项目”消息,等等。

最后,您通过对找到的项目的引用来调用SecKeychainItemDelete。

您可以定义搜索字典,因为您可以搜索密钥链中的每个项目,如密码,互联网密码,证书等。如果您想深入了解Apples钥匙串服务参考:

https://developer.apple.com/library/mac/documentation/Security/Reference/keychainservices/index.html#//apple_ref/c/func/SecCopyErrorMessageString

希望这有帮助