Importar un certificado de cliente en el llavero del iPhone
-
26-10-2019 - |
Pregunta
Estoy escribiendo una aplicación que se comunica con un servidor que requiere que el cliente se autentique utilizando un certificado de cliente. Necesito extraer el certificado de un archivo .p12 en el paquete de aplicaciones y agregarlo al llavero de la aplicación.
He estado tratando de descubrir cómo hacer que funcione desde Apple's "Tareas de servicios de certificado, clave y confianza para iOS", pero para mí parece incompleto y no especifica cómo agrego nada al llavero (?).
Estoy bastante perdido y cualquier ayuda es apreciada, ¡gracias de antemano!
Solución
"Tareas de servicios de certificado, clave y confianza para iOS"Contiene información suficiente para extraer certificado de un archivo .p12.
Desde el Listado 2-1 demuestre cómo puede extraer Secidentityref
Desde el listado de 2-2 segunda línea (// 1) muestra cómo puede copiarSeccertificateeref Fuera de SecidentityRef.
ejemplo Carga del archivo P12, extrae certificado, instale en el llavero. (El manejo de errores y la gestión de la memoria no se incluyeron)
NSString * password = @"Your-P12-File-Password";
NSString * path = [[NSBundle mainBundle]
pathForResource:@"Your-P12-File" ofType:@"p12"];
// prepare password
CFStringRef cfPassword = CFStringCreateWithCString(NULL,
password.UTF8String,
kCFStringEncodingUTF8);
const void *keys[] = { kSecImportExportPassphrase };
const void *values[] = { cfPassword };
CFDictionaryRef optionsDictionary
= CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1,
NULL, NULL);
// prepare p12 file content
NSData * fileContent = [[NSData alloc] initWithContentsOfFile:path];
CFDataRef cfDataOfFileContent = (__bridge CFDataRef)fileContent;
// extract p12 file content into items (array)
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
OSStatus status = errSecSuccess;
status = SecPKCS12Import(cfDataOfFileContent,
optionsDictionary,
&items);
// TODO: error handling on status
// extract identity
CFDictionaryRef yourIdentityAndTrust = CFArrayGetValueAtIndex(items, 0);
const void *tempIdentity = NULL;
tempIdentity = CFDictionaryGetValue(yourIdentityAndTrust,
kSecImportItemIdentity);
SecIdentityRef yourIdentity = (SecIdentityRef)tempIdentity;
// get certificate from identity
SecCertificateRef yourCertificate = NULL;
status = SecIdentityCopyCertificate(yourIdentity, &yourCertificate);
// at last, install certificate into keychain
const void *keys2[] = { kSecValueRef, kSecClass };
const void *values2[] = { yourCertificate, kSecClassCertificate };
CFDictionaryRef dict
= CFDictionaryCreate(kCFAllocatorDefault, keys2, values2,
2, NULL, NULL);
status = SecItemAdd(dict, NULL);
// TODO: error handling on status