2012-03-13 14 views
10

Cuando estoy creando cadenas de clave privada con el siguiente código PHP (y la misma configuración de parámetros), que están encerradas entre las diferentes cadenas:¿Por qué diferentes cadenas de clave privada bajo Linux o Windows?

$configs = array('config' => 'OpenSSL.cnf', 
       'digest_alg' => 'sha1', 
       'x509_extensions' => 'v3_ca', 
       'req_extensions' => 'v3_req', 
       'private_key_bits' => 2048, 
       'private_key_type' => OPENSSL_KEYTYPE_RSA, 
       'encrypt_key' => false, 
       'encrypt_key_cipher' => OPENSSL_CIPHER_3DES); 

$privateKeyResourceId = openssl_pkey_new($this->configs);      
openssl_pkey_export($privateKeyResourceId, $privateKeyString); 

En Linux los $ privateKeyString se parece a esto:

----- BEGIN PRIVATE KEY ----- ----- NBgkqhkiG9w0BAQE .... ASDFasjkfa FIN CLAVE PRIVADA -----

En Windows los $ privateKeyString se ve así:

----- BEGIN RSA PRIVATE KEY ----- ----- NBgkqhkiG9E .... ASDFasjkfa FIN clave privada RSA -----

Cuando copio de Windows clave privada para Linux funciona hasta que elimine el 'RSA' del inicio/finalización (el mismo comportamiento viceversa). ¿Por qué es esto?

+2

OpenSSL admite más de un formato de clave privada. El identificador de encabezado PEM cuyo formato se está utilizando. El primero está en un formato PKCS estándar e incluye un identificador que indica que es una clave RSA. El segundo está en un formato específico de RSA y, por lo tanto, no necesita ese identificador. El formato predeterminado cambió entre PHP 5.2.9 y 5.3.3. –

+1

Gracias por el comentario. Esto significaría que no es un problema de sistema operativo. Tengo que echarle un vistazo. – Mike

+0

Definitivamente no es un problema de sistema operativo. Es un problema de PHP. (Ninguno está roto, es solo que si su código espera uno y obtiene el otro, ...) –

Respuesta

4

Según un user note php.net este es un problema conocido:

Por favor, tome en cuenta que las versiones anteriores de PHP/OpenSSL exporta la clave privada RSA con '----- BEGIN la clave privada RSA ---- - 'Etiqueta PEM, que incluye solo el campo privateKey, omitiendo así los campos version y privateKeyAlgorithm.

El efecto de eso sería que si va a convertir a DER, y luego de vuelta a PEM, pero usando '----- BEGIN PRIVATE KEY -----' etiqueta PEM, que el ¡La función openssl_pkey_get_privatekey() fallará! El código de Senthryl se puede usar para prefijar los datos codificados PEM con los campos de versión y privateKeyAlgorithm nuevamente.

El más reciente de PHP/versiones de OpenSSL exporta la clave RSA privada con '----- BEGIN PRIVATE KEY -----' etiqueta PEM, que incluye la versión y campos privateKeyAlgorithm.

me di cuenta de estas diferencias entre mis dos servidores:

PHP Versión 5.3.3 (OpenSSL 1.0.0a-FIPS 1 jun 2010) en Fedora Core 12 x 64

PHP versión 5.2.9 (0,9 OpenSSL .8g 19 de octubre de 2007) en Fedora Core 10 x64

11

Esta es una diferencia entre las versiones de openssl y no de PHP. El siguiente comando openssl crea diferentes cabeceras/pies de página clave entre las versiones 0.9.x openssl y 1.0.0x:

openssl req -nuevo -keyout mykey.key salida privado mycertreq.csr -nodes -sha1 -newkey RSA : 2048

Para la versión 0.9.x, la cabecera de claves/pie es:

----- BEGIN RSA PRIVATE KEY ----- ----- END la clave privada RSA -----

Para la versión 1.0.0x, la clave encabezado/pie de página es:

----- BEGIN PRIVATE KEY ----- ----- END cLAVE PRIVADA --- -

Para la versión posterior de OpenSSL, que tiene que ejecutar el archivo de clave a través del siguiente comando para que sea compatible con la omisión más antigua:

openssl rsa -in mykey.key -text> mykey.pem

el archivo "mykey.pem", entonces ha encabezado/pie de página (y el formato) que es compatible con AWS y servicios similares.

+0

¡Gracias! ¡Eso resolvió mis problemas al intentar subir la clave a Amazon AWS! – powtac

Cuestiones relacionadas