Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 以编程方式从密钥链mac中删除私钥_Objective C_Macos_Security - Fatal编程技术网

Objective c 以编程方式从密钥链mac中删除私钥

Objective c 以编程方式从密钥链mac中删除私钥,objective-c,macos,security,Objective C,Macos,Security,我有一个p12文件,比如mycert.p12和一些密码,我使用安全工具导入它,并按照预期在keychain中正确安装,现在我正试图从keychain中删除私有和公共entires,我可以使用安全工具使用delete certificate-Z删除公共,但私钥不会被删除,如何使用SecItemDelete删除此脚本或任何可用的特殊脚本 谢谢您可以使用SecItemCopyMatching和SecKeychainItemDelete来实现这一点。第一个搜索项目,第二个删除项目 对于SecItemCo

我有一个p12文件,比如mycert.p12和一些密码,我使用安全工具导入它,并按照预期在keychain中正确安装,现在我正试图从keychain中删除私有和公共entires,我可以使用安全工具使用delete certificate-Z删除公共,但私钥不会被删除,如何使用SecItemDelete删除此脚本或任何可用的特殊脚本


谢谢

您可以使用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);
字典中的第一个对象key combo定义您正在搜索私钥。如果您正在搜索证书,则可以使用KSecClassCertificate;如果您正在搜索密码,则可以使用KSecClassGenericPassword

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

SecItemCopyMatching返回对找到的项的引用,3d定义引用的类型,这里是SecKeychainItemRef,因为该类型需要SecKeychainItemDelete

第四个定义了您只需要一个匹配项,如果您需要所有匹配项,则使用KSecMatchLimitAll

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

SecCopyErrorMessageString向您打印一条错误消息,您可以在其中查看它是否正确,然后打印没有错误,或者如果它找不到该项,那么您将得到一条未找到该项的消息,依此类推

最后,调用SecKeychainItemDelete并引用找到的项

您可以定义搜索字典,因为您可以搜索密钥链中的每一项,如密码、internet密码、证书等。如果您想更深入地了解苹果钥匙链服务参考:

希望这有帮助