Почему разные строки частного ключа в Linux или Windows?

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

$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 ----- END ЧАСТНЫЙ КЛЮЧ -----

В Windows $privateKeyString выглядит так:

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

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

Ответ 1

В соответствии с запиской пользователя php.net это известная проблема:

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

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

Новые версии PHP/OpenSSL экспортируют закрытый ключ RSA с помощью '----- НАЧАТЬ ЧАСТНЫЙ КЛЮЧ -----' тег PEM, который включает в себя версию и privateKeyAlgorithm.

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

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

PHP Version 5.2.9 (OpenSSL 0.9.8g 19 октября 2007 г.) на Fedora Core 10 x64

Ответ 2

Это различие между версиями 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 верхний/нижний колонтитул:

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

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

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

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

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

Затем файл mykey.pem имеет верхний и нижний колонтитулы (и формат), которые совместимы с AWS и похожими сервисами.