アプリのドキュメント フォルダーに、1 つの証明書と 1 つの秘密キーを含む 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)
私が今やろうとしているのは、後で使用できるように、この ID をキーチェーンに保存することです。私は iOS キーチェーンに関するさまざまなものを読みましたが、それが実際にどのように機能するかを理解するのに苦労しています。
Apple のコードは、persistent_ref を使用してキーチェーンに格納されている ID を取得しているようです。しかし、これが何なのかよくわかりません...メモリ参照のような単純な参照ですか?その場合、デバイスを再起動するとどうなりますか?
これについてこれ以上多くの情報を見つけることができませんでした kSecAttr 属性を使用して、別の方法で実行しようとしました。現在のコードは、キーチェーンに Identity を追加するために正常に機能します。
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で開発しています