我的应用程序文件夹中有一个 PKCS12 文件,其中包含一个证书和一个私钥。由于 Apple 的文档(https://developer.apple.com/library/ios/#documentation/Security/Conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks. html#//apple_ref/doc/uid/TP40001358-CH208-DontLinkElementID_10)
我现在要做的是将此身份存储到钥匙串中,以便以后使用。我在 iOS Keychain 上阅读了很多不同的东西,我很难弄清楚它是如何工作的。
Apple 的代码似乎使用 persistent_ref 来检索存储在 Keychain 中的身份。但我真的不明白这是什么......它是像内存引用这样的简单引用吗?如果是这种情况,当设备重新启动时会发生什么?
无法找到更多关于此的信息,我尝试通过使用 kSecAttr 属性来做不同的事情。当前代码可以很好地将 Identity 添加到 keychain :
NSMutableDictionary * dictionary = [[[NSMutableDictionary alloc] init] autorelease];
[dictionary setObject:@"LABEL" forKey:kSecAttrLabel];
[dictionary setObject:(id)newIdentity forKey:(id)kSecValueRef];
OSStatus status = SecItemAdd((CFDictionaryRef)dictionary, NULL);
但是,如果我再次尝试添加它,我会收到 -25299 错误,这是“很好”,因为它已经存在。我尝试通过这样的更新来处理它:
NSMutableDictionary *searchDictionary = [[[NSMutableDictionary alloc] init] autorelease];
[searchDictionary setObject:@"LABEL" forKey:kSecAttrLabel];
[searchDictionary setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
[searchDictionary setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnRef];
NSMutableDictionary *updateDictionary = [[NSMutableDictionary alloc] init];
[updateDictionary setObject:(id)newIdentity forKey:(id)kSecValueRef];
OSStatus status = SecItemUpdate((CFDictionaryRef)searchDictionary,(CFDictionaryRef)updateDictionary);
使用此代码,我显然会收到 -50 状态错误,因为我的参数无效......哪一个?为什么 ?我该怎么做才能正确更新我的钥匙串?
编辑:正如建议的那样,我尝试在添加现有元素之前删除它,但我遇到了相同的状态代码(-50)。下面是我试过的代码:
NSMutableDictionary *searchDictionary = [self setupSearchDirectoryForIdentifier:identifier];
OSStatus status = SecItemDelete((CFDictionaryRef)searchDictionary);
NSAssert(status == noErr, @"Problem deleting current keychain item." );
setupSearchDirectoryForIdentifier 只需使用我的项目标签创建一个 NSDictionnary:
- (NSMutableDictionary *)setupSearchDirectoryForIdentifier:(NSString *)identifier {
// Setup dictionary to access keychain.
NSMutableDictionary *searchDictionary = [[[NSMutableDictionary alloc] init] autorelease];
[searchDictionary setObject:identifier forKey:kSecAttrLabel];
return searchDictionary;
}
谢谢
PS:我正在 Xcode 4.2 / iPad 5.1.1 上开发