将私钥添加到iOS Keychain中

我正在尝试将私钥添加到iOS钥匙串中。 证书(公钥)工作正常,但私钥拒绝…我完全困惑为什么下面的代码不起作用。

首先,我正在检查钥匙串中当前的钥匙(钥匙是钥匙串是钥匙/值存储)是否是“自由的”。 然后我要添加私钥。

CFStringRef labelstring = CFStringCreateWithCString(NULL, [key cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8); NSArray* keys = [NSArray arrayWithObjects:(__bridge id)kSecClass,kSecAttrLabel,kSecReturnData,kSecAttrAccessible,nil]; NSArray* values = [NSArray arrayWithObjects:(__bridge id)kSecClassKey,labelstring,kCFBooleanTrue,kSecAttrAccessibleWhenUnlocked,nil]; NSMutableDictionary* searchdict = [NSMutableDictionary dictionaryWithObjects:values forKeys:keys]; CFRelease(labelstring); NSMutableDictionary *query = searchdict; CFTypeRef item = NULL; OSStatus error = SecItemCopyMatching((__bridge_retained CFDictionaryRef) query, &item); if (error) { NSLog(@"Error: %ld (statuscode)", error); } if(error != errSecItemNotFound) { SecItemDelete((__bridge_retained CFDictionaryRef) query); } [query setObject:(id)data forKey:(__bridge id)kSecValueData]; OSStatus status = SecItemAdd((__bridge_retained CFDictionaryRef) query, &item); if(status) { NSLog(@"Keychain error occured: %ld (statuscode)", status); return NO; } 

debugging输出如下:

 2012-07-26 15:33:03.772 App[15529:1b03] Error: -25300 (statuscode) 2012-07-26 15:33:11.195 App[15529:1b03] Keychain error occured: -25299 (statuscode) 

第一个错误代码-25300代表errSecItemNotFound 。 所以没有为这个键存储的值。 然后,当我尝试将私钥添加到钥匙串时,我得到-25299这意味着errSecDuplicateItem 。 我不明白。 为什么发生这种情况?

有没有人有这个线索或暗示?

苹果的错误代码:

 errSecSuccess = 0, /* No error. */ errSecUnimplemented = -4, /* Function or operation not implemented. */ errSecParam = -50, /* One or more parameters passed to a function where not valid. */ errSecAllocate = -108, /* Failed to allocate memory. */ errSecNotAvailable = -25291, /* No keychain is available. You may need to restart your computer. */ errSecDuplicateItem = -25299, /* The specified item already exists in the keychain. */ errSecItemNotFound = -25300, /* The specified item could not be found in the keychain. */ errSecInteractionNotAllowed = -25308, /* User interaction is not allowed. */ errSecDecode = -26275, /* Unable to decode the provided data. */ errSecAuthFailed = -25293, /* The user name or passphrase you entered is not correct. */ 

提前致谢!

更新#1:我发现它只是第一次有效。 即使数据和密钥不同,在第一次存储到钥匙串之后,我不能存储更多的密钥。

下面的代码为我工作:

 NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; [query setObject:(id)kSecClassKey forKey:(id)kSecClass]; [query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible]; [query setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData]; //adding access key [query setObject:(id)key forKey:(id)kSecAttrApplicationTag]; //removing item if it exists SecItemDelete((CFDictionaryRef)query); //setting data (private key) [query setObject:(id)data forKey:(id)kSecValueData]; CFTypeRef persistKey; OSStatus status = SecItemAdd((CFDictionaryRef)query, &persistKey); if(status) { NSLog(@"Keychain error occured: %ld (statuscode)", status); return NO; } 

对不起,但我永远不能debugging你的代码。 苹果提供了一些示例代码(KeychainItemWrapper),它可以让你保存一个string(我记得)。 这对处理钥匙链有很大的帮助。 networking上有一个要求是该类的修改版本,但保存和恢复字典(作为数据对象存档,这是苹果代码对string的作用)。 这使您可以将多个项目保存在钥匙串的一个界面中。 要点在于钥匙串为NSDictionary /数据