我正在尝试使用 OpenSSL 将 PEM 文件和 RSA 私钥转换为 PFX 文件。这是我尝试使用的示例命令:
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem
在这样做时,我收到以下错误消息:
unable to load private key
9068:error:0906D06C:PEM routines:PEM_read_bio:no start
line:pem_lib.c:696:Expecting: ANY PRIVATE KEY
该证书文件如下所示:
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
私钥如下所示:
-----BEGIN RSA PRIVATE KEY-----
....
-----END RSA PRIVATE KEY-----
我对这个错误进行了一些挖掘,但还没有找到解决方案。
编辑
经过一些额外的研究后,发现问题出在不同的 openssl 版本上。
如果我在运行 0.9.8zh 2016 年 1 月 14 日的 OSX 系统上运行它,这些语句可以正常工作。
但是,如果我在安装了 OpenSSL 1.0.1p 9 Jul 2015 和 OpenSSL 1.1.0g 2 Nov 2017 版本的 Windows 机器上运行它,就会出现上述错误。
答案1
我也遇到同样的问题。正如@thxmike 所说。我的情况也类似。
OpenSSL 命令没有按预期工作。
openssl pkcs12 -export -in c.cer -inkey c.key -out d.pfx
因此我最终在 Windows 上使用 Certutil。因为我们想将其添加到 Azure。
注意:-
1. 确保将 .crt 更改为 .cer。2
. 确保将 .cer 和 .key 文件放入同一文件夹中并使用相同的名称 - (c.cer 和 c.key)
然后运行:
certutil -MergePFX c.cer c.pfx
您应该会得到合并的 pfx 文件。
干杯!
答案2
经过一番挖掘,我发现是 Powershell 脚本生成了密钥和证书文件。
使用 Windows 上的 Notepad++ 和 OSX 上的 Tex-Edit Plus 来识别隐藏字符,我发现文件末尾有多余的 [cr]。
使用命令
openssl rsa -in <private key file> -noout -text
openssl x509 -in <cert file> -noout -text
可以很好地检查文件的有效性
由于我的源是 base64 编码的字符串,我最终在 Windows 上使用 certutil 命令(即
certutil -f -decode cert.enc cert.pem
certutil -f -decode key.enc cert.key
在 Windows 上生成文件。一旦文件正确,上面的 OpenSSL 命令就会按预期工作。
答案3
经历过类似的事情后问题看起来不同版本的 openssl 使用不同的私钥语法来解压 pfx 存档。它可以是传统格式,其中私钥以
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
或带有开始和结束的 PKSC#8 语法
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
*请注意,差异不仅仅在于 RSA 字。
因此,你可能必须将私钥从传统语法转换为 pksc8 语法
openssl pkcs8 -in <private key file> -topk8 -nocrypt -out <new private key file>
答案4
您可能有一个受密码保护的密钥文件。我必须删除密钥上的密码,然后它才起作用:
openssl rsa -in encrypted.key -out unencrypted.key
然后在初始命令中使用未加密的密钥:
openssl pkcs12 -export -out cert.pfx -inkey unencrypted.key -in cert.pem