2012-03-13 3 views
10

Quando sto creando le stringhe chiave privata con il seguente codice PHP (e lo stesso config-parametro), essi sono racchiusi tra le diverse stringhe:Perché diverse stringhe di chiavi private sotto 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); 

Su Linux il $ privateKeyString assomiglia a questo:

----- BEGIN CHIAVE PRIVATA ----- NBgkqhkiG9w0BAQE .... ASDFasjkfa ----- END CHIAVE PRIVATA -----

Su Windows il $ privateKeyString assomiglia a questo:

----- BEGIN chiave privata RSA ----- NBgkqhkiG9E .... ASDFasjkfa ----- END RSA chiave privata -----

Quando copio Windows stringa di chiavi privata per Linux funziona finché non rimuovo 'RSA' dall'inizio/fine (stesso comportamento viceversa). Perchè è questo?

+2

OpenSSL supporta più di un formato di chiave privata. L'identificatore dell'intestazione PEM in cui viene utilizzato il formato. Il primo è in un formato PKCS standard e include un identificatore che indica che si tratta di una chiave RSA. Il secondo è in un formato specifico RSA e quindi non ha bisogno di quell'identificatore. Il formato predefinito è cambiato tra PHP 5.2.9 e 5.3.3. –

+1

Grazie per il commento. Ciò significherebbe che non è un problema del sistema operativo. Devo dare un'occhiata. – Mike

+0

Non è sicuramente un problema del sistema operativo. È un problema di PHP. (Né è rotto, è solo che se il tuo codice si aspetta uno e ottiene l'altro, ...) –

risposta

4

Secondo un user note php.net questo è un problema noto:

Si prega di prendere atto che le vecchie versioni di PHP/OpenSSL esporta la chiave privata RSA con '----- BEGIN chiave privata RSA ---- - 'Tag PEM, che include solo il campo privateKey, omettendo quindi i campi version e privateKeyAlgorithm.

L'effetto di questo è che se si sta convertendo a DER, e poi di nuovo a PEM, ma utilizzando '----- BEGIN CHIAVE PRIVATA -----' tag PEM, che la La funzione openssl_pkey_get_privatekey() fallirà! Il codice di Senthryl può essere utilizzato per aggiungere di nuovo il prefisso ai dati codificati PEM con i campi privateKeyAlgorithm della versione e privateKeyAlgorithm.

Il PHP più recente/versioni OpenSSL esporta la chiave RSA privata con '----- BEGIN CHIAVE PRIVATA -----' tag PEM, che include la versione e campi privateKeyAlgorithm.

ho notato queste differenze tra i miei due server:

PHP versione 5.3.3 (OpenSSL 1.0.0a FIPS 1 giu 2010) su Fedora Core 12 x 64

PHP versione 5.2.9 (OpenSSL 0.9 .8g 19 ott 2007) su Fedora Core 10 x64

11

Questa è una differenza tra le versioni openssl non PHP. Il seguente comando openssl crea diverse intestazioni chiave/piè di pagina tra le versioni di OpenSSL 0.9.x e 1.0.0x:

openssl req -new -keyout mykey.key -out mycertreq.csr -nodes -sha1 -newkey rsa : 2048

Per la versione 0.9.x, la chiave di intestazione/piè di pagina è:

----- BEGIN chiave privata RSA ----- ----- END chiave privata RSA -----

Per la versione 1.0.0x, la chiave di intestazione/piè di pagina è:

----- BEGIN cHIAVE PRIVATA ----- ----- END cHIAVE PRIVATA --- -

Per la versione più recente di OpenSSL, devo correre il file di chiave attraverso il seguente comando per renderlo compatibile con il default più vecchio:

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

il file "mykey.pem", quindi ha l'intestazione/piè di pagina (e formato), che è compatibile con AWS e servizi analoghi.

+0

Grazie! Questo ha risolto i miei problemi quando ho provato a caricare la chiave su Amazon AWS! – powtac