2013-10-31 122 views
4

我开发IPhone需要一个证书来调用一些服务的应用程序,所以我加入了证书,我的钥匙串这样做:SecItemAdd创建两个身份

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在此代码之前,结果是none,并且在此代码之后,返回是两个身份和一个证书。 当我尝试使用身份标识时,一个正常工作,另一个没有。为什么SecItemAdd为一个kSecClassCertificate创建两个kSecClassIdentity?我怎样才能找到正确的?

回答

1

我只是不得不解决这个问题,从我的研究中,问题是其中一个身份包含私钥,另一个包含公钥。

所以,当你试图取回你必须

value: kSecAttrKeyClassPrivate/kSecAttrKeyClassPublic 
key: kSecAttrKeyClass 

添加到用作过滤字典中SecItemCopyMatching身份如:

NSMutableDictionary *filterDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
              (__bridge id)kSecClassIdentity, kSecClass, 
              kSecMatchLimitAll,    kSecMatchLimit, 
              kCFBooleanTrue,     kSecReturnRef, 
              kSecAttrKeyClassPrivate,  kSecAttrKeyClass, 
              nil]; 
+0

这必须是一个钥匙扣错误,因为它对每个证书拥有多个身份是没有意义的,也没有与私钥没有关联的身份。你有没有向苹果提交错误报告? –