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!

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top