2011-03-24 84 views
6

Estoy tratando de convertir algunos archivos .p12 en .pem.Convertir P12 a PEM usando PHP y OpenSSL

en mi Mac funciona, sin interacción como pongo las contraseñas en el código, pero cuando se utiliza este código:

system('openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12 -passin pass:'); 
system('openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12 -passout pass:1234 -passin pass:'); 
system('openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem -passin pass:1234'); 
system('cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem'); 

que hace que los archivos en blanco.

Mis permisos de archivo son 755. y para el passin las contraseñas se establecieron para nada así que por eso que están en blanco ... todo el código aquí sin el sistema() funciona en el terminal de Mac ..

gracias para leer. espero que pueda ayudar

+0

¿Hay alguna razón en particular para evitar la función integrada ['openssl_pkcs12_read'] (http://us2.php.net/manual/en/function.openssl-pkcs12-read.php)? – Charles

+0

@Charles si funciona, lo usaría, pero no sé cómo implementarlo con lo que quiero. – user633268

+1

@user, los datos que devuelve son una matriz que incluye la clave privada, que parece ser lo que está tratando de extraer aquí. Debería poder usar ['openssl_pkey_export_to_file'] (http://us3.php.net/manual/en/function.openssl-pkey-export-to-file.php) o [' openssl_pkey_export'] (http://us3.php.net/manual/en/function.openssl-pkey-export.php) para tomar la clave en formato PEM. – Charles

Respuesta

19
$filename = 'apns-dev-cert.p12'; 
$password = '...'; 
$results = array(); 
$worked = openssl_pkcs12_read(file_get_contents($filename), $results, $password)); 
if($worked) { 
    echo '<pre>', print_r($results, true), '</pre>'; 
} else { 
    echo openssl_error_string(); 
} 

Por favor intente ejecutar este fragmento de código. Establezca $password en cualquier frase de contraseña necesaria para abrir el archivo. Si no hay contraseña, establézcala en nulo. No creo que se necesite uno de tus comandos openssl.

debería obtener la salida con la clave privada deseada, probablemente dentro de $results['pkey'].

Si ve que su clave privada no, entonces puede pasar a openssl_pkey_export conseguirlo en formato PEM, que luego se puede escribir en un archivo:

$new_password = null; 
$result = null; 
$worked = openssl_pkey_export($results['pkey'], $result, $new_password); 
if($worked) { 
    echo "<pre>It worked! Your new pkey is:\n", $result, '</pre>'; 
} else { 
    echo openssl_error_string(); 
} 

Establecer $new_password a su contraseña tecla p deseada, si quieres uno

Esto debería trabajar para usted, basado en lo que estoy leyendo en las distintas páginas de documentación.


Si realmente desea seguir utilizando el comando openssl por los bombardeos a cabo, por favor, considere el uso de proc_open en lugar de system, de manera que se puede coger correctamente los mensajes de error.

También es posible que OpenSSL intente leer el archivo de configuración, y no tenga permiso para hacerlo, aunque debería darle un error al respecto.

+0

Gracias, ¿cómo harías un archivo para el bit de certificación? gracias por toda tu ayuda has sido increíble. – user633268

+0

El certificado * probablemente * estará en '$ resultado ['cert']' después de leerlo del archivo PKCS12. Debería poder usar ['openssl_x509_export'] (http://www.php.net/manual/en/function.openssl-x509-export.php) para hacer el trabajo. (¡Cuidado!Si copió y pegó mi código, reutilicé algunos nombres de variables que podrían causar problemas. Tendrás que ajustar eso en consecuencia). – Charles

Cuestiones relacionadas