Cómo hacer que un file p12 válido sea importado correctamente por SecPKCS12Import

He resuelto mi problema previo de convertir la key privada XML RSA en un file PEM, pero me encuentro con otro problema que consigo datos nulos al importar la key privada P12. Los siguientes son mis pasos:

  1. Convertir file PEM a file P12

    openssl> pkcs12 -export -in rsa.pem -inkey rsa.pem -out rsa.p12 -nocerts 
  2. Lea el file P12 al proyecto iOS

     NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"MyPrivateKey" ofType:@"p12"]; NSData *p12data = [NSData dataWithContentsOfFile:path]; if (![self getPrivateKeyRef]) RSAPrivateKey = getPrivateKeywithRawKey(p12data); 
  3. Importar key privada P12

     SecKeyRef getPrivateKeywithRawKey(NSData *pfxkeydata) { NSMutableDictionary * options = [[[NSMutableDictionary alloc] init] autorelease]; // Set the public key query dictionary //change to your .pfx password here [options setObject:@"MyPassword" forKey:(id)kSecImportExportPassphrase]; CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); OSStatus securityError = SecPKCS12Import((CFDataRef) pfxkeydata, (CFDictionaryRef)options, &items); CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0); SecIdentityRef identityApp = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity); //NSLog(@"%@", securityError); assert(securityError == noErr); SecKeyRef privateKeyRef; SecIdentityCopyPrivateKey(identityApp, &privateKeyRef); return privateKeyRef; } 

Pensé que no había err (el valor de OSStatus es 0), pero la matriz de elementos no obtuvo ningún dato de identidad. Me pregunto si no obtuve el formatting correcto de file p12 debido al uso incorrecto de OpenSSl. ¿Alguien ha importado correctamente el file p12? Me he quedado atascado en este problema por un par de días, por favor dame consejos si tienes pistas, ¡gracias!

Hubert

Recibí algunos consejos de Internet, y los siguientes son los pasos para get la key P12 aceptable de iOS y el file de certificación:

  1. convertir XML a PEM
    Shell> comstackr XMLSpec2PEM.java
    Shell> XMLSpec2PEM rsa.xml
    guarde el resultado de salida en rsa.pem
    (pide prestado de aquí )

  2. convertir PEM a key privada RSA
    OpenSSL> rsa -in rsa.pem -out rsaPrivate.key

  3. Genera una request de certificación.
    OpenSSL> req -new -key rsaPrivate.key -out rsaCertReq.crt
    (ingrese algunos datos básicos de certificación)

  4. Firmar la certificación de la request
    OpenSSL> x509 -req -days 3650 -in rsaCertReq.crt -signkey rsaPrivate.key -out rsaCert.crt

  5. Convierta el formatting del file de certificación en DER (formatting aceptable para iOS)
    OpenSSL> x509 -outform der -in rsaCert.crt -out rsaCert.der

  6. Generar key privada PKCS12 (formatting aceptable para iOS)
    OpenSSL> pkcs12 -export -out rsaPrivate.pfx -inkey rsaPrivate.key -in rsaCert.crt

Sin más pasos, los files generados en los pasos 5 y 6 ahora se pueden usar en iOS.

Referencia de las instrucciones de OpenSSL:
http://blogs.yaclife.com/?tag=ios%E3%80%80seckeyref%E3%80%80raw%E3%80%80key%E3%80%80rsa%E3%80%803des

http://devsec.org/info/ssl-cert.html