20

秘密鍵を 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;
}

デバッグ出力は次のとおりです。

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ます。ぜんぜんわかりません。なぜこうなった?

誰もこれについて手がかりやヒントを持っていますか?

Apple のエラー コード:

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: 初めてしか機能しないことがわかりました。データとキーが異なる場合でも、キーチェーンに初めて保存した後は、それ以上キーを保存できません。

4

2 に答える 2

8

次のコードは私のために働いた:

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; 
}
于 2012-09-12T11:57:31.940 に答える
1

申し訳ありませんが、コードをデバッグすることはできません。Apple は、1 つの文字列を保存できるサンプル コード (KeychainItemWrapper) を提供しています (思い出しました)。キーチェーンを扱うのに大きな助けになります。そのクラスの変更されたバージョンである Web 上の要点がありますが、辞書を保存および復元します (データ オブジェクトとしてアーカイブされます。これは、Apple コードが文字列に対して行うことです)。これにより、1 つのインターフェイスで複数のアイテムをキーチェーンに保存できます。要旨はこちらNSDictionary/dataのキーチェーン

于 2012-07-26T23:23:30.813 に答える