当我使用以下PHP代码(和相同的config-parameter)创建私钥字符串时,它们被包含在不同的字符串之间:
$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看起来像这样:
----- BEGIN PRIVATE KEY ----- NBgkqhkiG9w0BAQE .... ASDFasjkfa ----- END PRIVATE KEY -----
在Windows上,$ privateKeyString如下所示:
-----开始RSA私钥----- NBgkqhkiG9E .... ASDFasjkfa ----- END RSA私钥-----
当我将Windows私钥字符串复制到Linux时,它一直工作,直到我从开始/结束删除'RSA'(相反的行为反之亦然)。这是为什么?
答案 0 :(得分:11)
这是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版,关键页眉/页脚是:
-----开始私钥----- ----- END PRIVATE KEY -----
对于更高版本的openssl,我必须通过以下命令运行密钥文件,使其与旧的默认版本兼容:
openssl rsa -in mykey.key -text> mykey.pem
“mykey.pem”文件的页眉/页脚(和格式)与AWS 兼容,服务类似。
答案 1 :(得分:4)
根据user note php.net,这是一个已知问题:
请注意旧版本的PHP / OpenSSL使用'----- BEGIN RSA PRIVATE KEY -----'PEM标记导出RSA私钥,该标记仅包含privateKey字段,因此省略了版本和privateKeyAlgorithm字段。
这样做的效果是,如果你将它转换为DER,和 然后回到PEM,但使用'----- BEGIN PRIVATE KEY -----'PEM标签, openssl_pkey_get_privatekey()函数将失败!Senthryl的 代码可用于为PEM编码数据添加版本和前缀 privateKeyAlgorithm字段。
较新的PHP / OpenSSL版本导出RSA私钥 '----- BEGIN PRIVATE KEY -----'PEM标签,包括版本和 privateKeyAlgorithm字段。
我注意到我的两台服务器之间存在这些差异:
Fedora Core 12 x64上的PHP版本5.3.3(OpenSSL 1.0.0a-fips 2010年6月1日)
Fedora Core 10 x64上的PHP版本5.2.9(OpenSSL 0.9.8g,2007年10月19日)