如何在iPhone钥匙串中添加安全标识(证书+私钥)?

时间:2010-05-05 12:38:18

标签: iphone security

如何将安全标识(证书+私钥)添加到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 - >没有可靠的信任结果。 我做错了什么?

3 个答案:

答案 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;
}

我希望这也有助于其他人。