为什么Linux或Windows下有不同的私钥字符串?

时间:2012-03-13 04:04:04

标签: php openssl rsa x509

当我使用以下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'(相反的行为反之亦然)。这是为什么?

2 个答案:

答案 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日)