如何将安全标识(证书+私钥)添加到iPhone钥匙串? 我在应用程序中有.p12文件。我可以使用SecPKCS12Import()来获取它的身份 当我尝试执行以下操作时:
NSMutableDictionary *secIdentityParams = [[NSMutableDictionary alloc] init];
[secIdentityParams setObject:(id)kSecClassIdentity forKey:(id)kSecClass];
[secIdentityParams setObject:label forKey:(id)kSecAttrLabel];
[secIdentityParams setObject:(id)myIdentity forKey:(id)kSecValueRef];
status = SecItemAdd((CFDictionaryRef) secIdentityParams, NULL);
我收到错误= -25291 - >没有可靠的信任结果。 我做错了什么?
答案 0 :(得分:4)
只需在属性字典中使用1个参数即可向keychain添加标识:
NSMutableDictionary *secIdentityParams = [[NSMutableDictionary alloc] init];
[secIdentityParams setObject:(id)myIdentity forKey:(id)kSecValueRef];
OSStatus status = SecItemAdd((CFDictionaryRef) secIdentityParams, NULL);
答案 1 :(得分:2)
使用kSecValueRef作为唯一参数可以很好地工作。你知道为什么函数在其他参数失败时会失败,例如提供kSecClass? 钥匙串服务参考记录了SecItemAdd()
的第一个参数,如下所示:
包含项目类的字典 键值对[...]和可选 属性键值对[...] 指定项目的属性 值。
我假设kSecClass是必须始终存在的必需参数,使用SecItemAdd()
或SecItemCopyMatching()
时。 Certificate, Key, and Trust Services Tasks on iOS解释了向Keychain添加SecIdentityRef
的过程如下(清单2-3):
CFDataRef persistentRefForIdentity(SecIdentityRef identity)
{
OSStatus status;
CFTypeRef identity_handle = NULL;
const void *keys[] = { kSecReturnPersistentRef, kSecValueRef };
const void *values[] = { kCFBooleanTrue, identity };
CFDictionaryRef dict = CFDictionaryCreate(NULL, keys, values,
2, NULL, NULL);
status = SecItemAdd(dict, &persistent_ref);
if (dict)
CFRelease(dict);
return (CFDataRef)persistent_ref;
}
这个例子错了吗?
答案 2 :(得分:2)
通过SecIdentityRef
添加新的SecItemAdd()
后,我设法让Keychain服务返回持久性钥匙串参考。这是工作代码:
- (NSData *)persistentKeychainReferenceForIdentity:(SecIdentityRef)identity
{
NSData *persistentRef = nil;
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
(id)identity, kSecValueRef,
(id)kCFBooleanTrue, kSecReturnPersistentRef,
nil];
OSStatus itemAddStatus = SecItemAdd((CFDictionaryRef)attributes,
(CFTypeRef *)&persistentRef);
if (itemAddStatus != errSecSuccess)
{
return nil;
}
return persistentRef;
}
我希望这也有助于其他人。