2012-04-05 11 views
10

He resuelto mi problema anterior de convertir la clave privada XML RSA al archivo PEM, pero me encuentro con otro problema al obtener datos nulos al importar la clave privada P12. Lo que sigue es mis pasos: archivo PEMCómo hacer que un archivo p12 válido sea importado correctamente por SecPKCS12Import

  1. Convertir a archivo P12

    openssl> pkcs12 -export -in rsa.pem -inkey rsa.pem -out rsa.p12 -nocerts 
    
  2. Leer archivo 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. P12 Importación de la clave privada

    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 errores (el valor OSStatus es 0), pero la matriz de elementos no obtuvo ningún dato de identidad. Me pregunto si no obtuve el formato de archivo p12 correcto debido al uso incorrecto de OpenSSl. ¿Alguien ha importado con éxito el archivo p12? Me he quedado atrapado en este problema por un par de días, por favor dame consejos si tienes pistas, ¡gracias!

Hubert

+0

sobre el uso de OpenSSL: 1) La clave de entrada no será seguramente el mismo que su certificado de entrada 2) doc dice '-nocerts' creará ningún certificado en la salida; ¿Lo intentaste sin eso? – MrTJ

Respuesta

8

me dieron algunos consejos de la Internet, y la siguiente es los pasos para obtener la clave de p12 y certificación aceptable archivo de IOS:

  1. XML convertido al PEM
    Shell> compilar XMLSpec2PEM. java
    Shell> XMLSpec2PEM rsa.xml
    guardar el resultado de la salida a rsa.pem
    (prestado de here)

  2. convertido PEM a la clave privada RSA
    OpenSSL> RSA -en rsa.pem salida privado rsaPrivate.key

  3. generar una solicitud de certificación
    OpenSSL> req -nuevo tecla rsaPrivate.key salida privado rsaCertReq .crt
    (entrada de algunos datos de certificación básica)

  4. certificación sesión de la solicitud
    OpenSSL> x509 -req -days 3650 -en rsaCertReq.crt -signkey rsaPrivate.key salida privado RSAC ert.crt

  5. convertir el formato de archivo de certificación de DER (formato IOS aceptable)
    OpenSSL> x509 -outform der -en rsaCert.crt salida privado rsaCert.der

  6. Generar PKCS12 clave privada (formato aceptable iOS)
    OpenSSL> pkcs12 -export salida privado rsaPrivate.pfx -inkey rsaPrivate.key -en rsaCert.crt

ninguna medida adicional, archivos de géneros ted en el paso 5 y 6 ahora se puede utilizar 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

+1

Gracias por informar sobre Hubert. Esa es una manera terriblemente indirecta de convertir una clave privada codificada en XML en una representación interna, pero debería ser correcta y no estoy seguro de si hay una forma más sólida (aparte de escribir la rutina de conversión en Objective C, por supuesto). ¡Oh, puedes aceptar tus propias respuestas después de un tiempo! –

+0

Supongo que la respuesta sería sí. Lo que he hecho arriba es simplemente usar la herramienta de línea de comandos openssl para convertirlo en un formato de clave válido, por lo que las operaciones se pueden hacer con la API de openssl. No hice esto simplemente porque solo necesito hacerlo una vez. –

+0

En mi caso, el paso 2 "convertir PEM a clave privada RSA" produjo exactamente el mismo archivo de salida que el archivo de entrada. Sin embargo, el archivo p12 producido después de seguir todos los pasos era exactamente lo que necesitaba para mi aplicación iOS y encontrar esta publicación fue de gran ayuda. –

Cuestiones relacionadas