4

我正在为需要证书来调用某些服务的 iPhone 开发一个应用程序,因此我正在向我的钥匙串添加一个证书:

 SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certificadoData);
 NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
 [dictionary setObject:(__bridge id)kSecClassCertificate forKey:(__bridge id)kSecClass];
 [dictionary setObject:(__bridge id)(cert) forKey:(__bridge id<NSCopying>)(kSecValueRef)];
 OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dictionary, NULL);

当我在此代码之前列出所有 kSecClassIdentity 时,结果为无,在此代码之后,返回的是两个身份和一个证书。当我尝试使用这些身份时,一个工作正常,而另一个工作不正常。为什么 SecItemAdd 为一个 kSecClassCertificate 创建两个 kSecClassIdentity?以及如何识别正确的?

4

1 回答 1

1

我只需要解决这个问题,根据我的研究,问题是其中一个身份包含私钥,另一个身份包含公钥。

因此,当您尝试检索必须添加的身份时

value: kSecAttrKeyClassPrivate / kSecAttrKeyClassPublic
key: kSecAttrKeyClass

到用作过滤器的字典,SecItemCopyMatching例如:

NSMutableDictionary *filterDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                             (__bridge id)kSecClassIdentity, kSecClass,
                                             kSecMatchLimitAll,              kSecMatchLimit,
                                             kCFBooleanTrue,                 kSecReturnRef,
                                             kSecAttrKeyClassPrivate,        kSecAttrKeyClass,
                                             nil];
于 2015-05-15T15:36:48.873 回答