【问题标题】:Delete Private key from keychain mac programmatically以编程方式从钥匙串 mac 中删除私钥
【发布时间】:2015-03-05 15:57:16
【问题描述】:

我有一个 p12 文件,比如带有一些密码的 mycert.p12,我使用安全工具将其导入,并按预期正确安装在钥匙串中,现在我正在尝试从钥匙串中删除私有和公共条目,我可以删除公众使用 delete-certificate -Z 和安全工具,但私钥没有被删除,如何使用 SecItemDelete 删除这个或任何可用的特殊脚本。

谢谢

【问题讨论】:

    标签: objective-c macos security


    【解决方案1】:

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

    对于 SecItemCopyMatching,您需要定义一个搜索字典,它定义了您要查找的项目,例如您可以使用要查找的钥匙的钥匙串名称。例如,我有一个名为“iPhone Configuration Utility (8AE57ABA-8DCD-4A29-9013-07FB2AEDADCE)”的私钥。

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

    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。

    第二个定义了Keychain中item的名字,用KSecAttrLabel。

    SecItemCopyMatching返回找到的item的引用,3d定义了引用的类型,这里是SecKeychainItemRef,因为这个类型需要SecKeychainItemDelete。

    第 4 个定义你只想要一个匹配项,如果你想要所有匹配项然后使用 KSecMatchLimitAll。

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

    SecCopyErrorMessageString 向您打印一条错误消息,您可以在其中查看它是否正确,然后打印 No Error,或者如果它找不到该项目,那么您会收到一条 Item not found 消息等等。

    最后你调用 SecKeychainItemDelete 并引用找到的项目。

    您有多种可能性来定义搜索字典,因为您可以搜索钥匙串中的每个项目,例如密码、互联网密码、证书等。如果您想深入了解 Apple 的钥匙串服务参考:

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2013-11-03
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多