Estoy tratando de agregar una clave privada en el llavero de iOS. El certificado (clave pública) funciona bien pero la clave privada se niega ... Estoy totalmente confundido por qué el siguiente código no funciona.Agregar clave privada en iOS Keychain
Primero estoy comprobando si la clave actual (= clave en caso de que el Llavero sea un almacén de claves/valores) está 'libre' en el Llavero. Luego voy a agregar la clave privada.
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;
}
salida La depuración es la siguiente:
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)
El primero código de error -25300
representa errSecItemNotFound
. Entonces no hay ningún valor almacenado para esta clave. Luego, cuando trato de agregar la clave privada en el llavero, obtengo -25299
, que significa errSecDuplicateItem
. No entiendo esto. ¿Por qué está pasando esto?
¿Alguien tiene una pista o pista sobre esto?
códigos de error de 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. */
Gracias de antemano!
Actualización n. ° 1: He descubierto que funciona solo por primera vez. Incluso cuando los datos y la clave son diferentes, después de la primera vez que guardé el llavero no puedo almacenar más llaves.
que estoy enfrentando el mismo problema exacto. La primera clave añadida usando SecItemAdd sin problema, luego cualquier llamada consecutiva a SecItemAdd falla con errSecDuplicateItem aunque a pesar de SecItemCopyMatching devolver errSecItemNotFound. ¿Has encontrado una solución para esto todavía? – 100grams