Почему разные строки частного ключа в 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 и похожими сервисами.