Php 为什么在Linux或Windows下使用不同的私钥字符串?

Php 为什么在Linux或Windows下使用不同的私钥字符串?,php,openssl,rsa,x509,Php,Openssl,Rsa,X509,当我使用以下PHP代码(和相同的配置参数)创建私钥字符串时,它们被封装在不同的字符串之间: $configs = array('config' => 'OpenSSL.cnf', 'digest_alg' => 'sha1', 'x509_extensions' => 'v3_ca', 'req_extensions' => 'v3_req',

当我使用以下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------结束私钥-----

在Windows上,$privateKeyString如下所示:

-----开始RSA私钥------NBgkqhkiG9E…ASDFasjkfa------结束RSA私钥-----

当我将Windows私钥字符串复制到Linux时,它会一直工作,直到我从开始/结束处删除“RSA”(反之亦然)。这是为什么?

根据一项研究,这是一个已知的问题:

请注意,较早版本的PHP/OpenSSL会导出带有“----BEGIN RSA private key---”PEM标记的RSA私钥,该标记只包含privateKey字段,因此省略了version和privateKeyAlgorithm字段

这样做的效果是,如果你把它转换成DER 然后返回PEM,但使用“----开始私钥---”PEM标记, openssl_pkey_get_privatekey()函数将失败!森特里尔氏 代码可用于在PEM编码数据前加上版本和 privateKeyAlgorithm字段

较新的PHP/OpenSSL版本将RSA私钥导出为 “----开始私钥------”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日)


这是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私钥----- -----结束RSA私钥-----

对于版本1.0.0x,关键页眉/页脚为:

-----开始私钥----- -----结束私钥-----

对于更高版本的openssl,我必须通过以下命令运行密钥文件,使其与旧的默认值兼容:

openssl rsa-在mykey.key-text>mykey.pem中


“mykey.pem”文件的页眉/页脚(和格式)与AWS和类似服务兼容。

OpenSSL支持多种私钥格式。正在使用的格式的PEM标头标识符。第一个是标准PKCS格式,包含一个标识符,指示它是RSA密钥。第二个是特定于RSA的格式,因此不需要该标识符。默认格式在PHP5.2.9和5.3.3之间更改。感谢您的评论。这意味着这不是操作系统的问题。我必须检查一下,这绝对不是操作系统的问题。这是一个PHP问题。(两者都不坏,只是如果您的代码期望一个而得到另一个,…)谢谢!这解决了我在尝试将密钥上传到Amazon AWS时遇到的问题!