Почему разные строки закрытых ключей под Linux или Windows? - PullRequest
10 голосов
/ 13 марта 2012

Когда я создаю строки закрытого ключа со следующим PHP-кодом (и тем же параметром config), они заключаются в разные строки:

$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);

В Linux $ privateKeyString выглядит следующим образом:

----- НАЧАТЬ ЧАСТНЫЙ КЛЮЧ ----- NBgkqhkiG9w0BAQE .... ASDFasjkfa ----- КОНЕЦ ЧАСТНОГО КЛЮЧА -----

В Windows $ privateKeyString выглядит следующим образом:

----- BEGIN RSA ЧАСТНЫЙ КЛЮЧ ----- NBgkqhkiG9E .... ASDFasjkfa ----- END RSA ЧАСТНЫЙ КЛЮЧ -----

Когда я копирую строку закрытого ключа Windows в Linux, она работает до тех пор, пока я не удалю «RSA» из начала / конца (то же самое поведение наоборот). Почему это?

Ответы [ 2 ]

11 голосов
/ 07 декабря 2012

Это различие между версиями openssl, а не PHP. Следующая команда openssl создает разные верхние и нижние колонтитулы между версиями openssl 0.9.x и 1.0.0x:

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

Для версии 0.9.x верхний / нижний колонтитул ключа:

----- BEGIN RSA ЧАСТНЫЙ КЛЮЧ ----- ----- END RSA ЧАСТНЫЙ КЛЮЧ -----

Для версии 1.0.0x верхний / нижний колонтитул ключа:

----- НАЧАТЬ ЧАСТНЫЙ КЛЮЧ ----- ----- КОНЕЦ ЧАСТНОГО КЛЮЧА -----

Для более поздней версии openssl мне нужно запустить файл ключа с помощью следующей команды, чтобы сделать его совместимым со старым значением по умолчанию:

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

Файл «mykey.pem» тогда имеет верхний / нижний колонтитулы (и формат), которые совместимы с AWS и аналогичными службами.

4 голосов
/ 13 марта 2012

Согласно замечанию пользователя php.net это известная проблема:

Обратите внимание, что более старые версии PHP / OpenSSL экспортируют закрытый ключ RSA с помощью тега PEM ----- BEGIN RSA PRIVATE KEY -----, который включает в себя только поле privateKey, таким образом, пропуская версию и Поля privateKeyAlgorithm.

Эффект этого будет, если вы преобразуете его в DER, и затем вернемся к PEM, но с помощью тега '----- BEGIN PRIVATE KEY -----' PEM, что функция openssl_pkey_get_privatekey () потерпит неудачу! код может быть использован для префикса PEM-кодированных данных с версией и Поля privateKeyAlgorithm снова.

Более новые версии PHP / OpenSSL экспортируют закрытый ключ RSA с PEG тег «----- BEGIN PRIVATE KEY -----», который включает в себя версию и Поля privateKeyAlgorithm.

Я заметил эти различия между моими двумя серверами:

PHP версии 5.3.3 (OpenSSL 1.0.0a-fips, 1 июня 2010 г.) в Fedora Core 12 x64

PHP версии 5.2.9 (OpenSSL 0.9.8g, 19 октября 2007 г.) в Fedora Core 10 x64

...