Ich versuche, einen privaten Schlüssel in den iOS-Schlüsselbund hinzuzufügen. Das Zertifikat (öffentlicher Schlüssel) funktioniert gut, aber der private Schlüssel verweigert ... Ich bin total verwirrt, warum der folgende Code nicht funktioniert.Hinzufügen eines privaten Schlüssels zu iOS Keychain
Zuerst überprüfe ich, ob der aktuelle Schlüssel (= Schlüssel im Falle dass der Schlüsselbund ein Schlüssel/Wertspeicher ist) 'frei' im Schlüsselbund ist. Dann werde ich den privaten Schlüssel hinzufügen.
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;
}
Die Debug-Ausgabe ist die folgende:
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)
Der erste Fehlercode -25300
errSecItemNotFound
darstellt. Daher ist für diesen Schlüssel kein Wert gespeichert. Dann, wenn ich versuche, den privaten Schlüssel in den Schlüsselbund hinzuzufügen, bekomme ich -25299
, was errSecDuplicateItem
bedeutet. Ich verstehe das nicht. Warum passiert dies?
Hat jemand eine Ahnung oder einen Hinweis darauf?
Fehlercodes von 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. */
Vielen Dank im Voraus!
Update # 1: Ich habe herausgefunden, dass es nur zum ersten Mal funktioniert. Auch wenn Daten und Schlüssel anders sind, kann ich nach dem ersten Mal, das im Schlüsselbund gespeichert ist, keine weiteren Schlüssel speichern.
ich genau das gleiche Problem konfrontiert bin. Der erste Schlüssel wurde mit SecItemAdd ohne Probleme hinzugefügt, dann schlägt jeder nachfolgende Aufruf von SecItemAdd mit errSecDuplicateItem fehl, obwohl SecItemCopyMatching errSecItemNotFound zurückgibt. Haben Sie schon eine Lösung gefunden? – 100grams