我在我的應用程序的文檔文件夾中有一個PKCS12文件,其中包含一個證書和一個私鑰。 我可以打開此.p12文件,提取標識對象並顯示一些信息,這要歸功於Apple的文檔(https://developer.apple.com/library/ios/#documentation/Security/Conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks .html#// apple_ref/doc/uid/TP40001358-CH208-DontLinkElementID_10)如何將已添加的SecIdentityRef更新爲iOS應用程序的鑰匙串?
我現在要做的是將此標識存儲到鑰匙串中,以便稍後使用它。我已經閱讀了iOS Keychain上的很多不同的東西,我很難弄清它是如何工作的。
Apple的代碼似乎使用persistent_ref來檢索存儲在Keychain中的Identity。但我真的不明白這是什麼...它是一個簡單的參考,如記憶參考?如果是這種情況,設備重新啓動時會發生什麼?
無法找到關於此的更多信息我試圖通過使用kSecAttr屬性以不同方式執行此操作。 目前的代碼工作正常添加身份到鑰匙串:
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
剛編輯我的問題。我試圖刪除之前添加項目,但我仍然有相同的狀態代碼,即使我只在searchDictionary中有一個元素。對我來說沒有多大意義。 – Anth0