OpenSSL 使用 RSA 私钥将 PEM 转换为 PFX

OpenSSL 使用 RSA 私钥将 PEM 转换为 PFX

我正在尝试使用 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>

https://linux.die.net/man/1/pkcs8

答案4

您可能有一个受密码保护的密钥文件。我必须删除密钥上的密码,然后它才起作用:

openssl rsa -in encrypted.key -out unencrypted.key

然后在初始命令中使用未加密的密钥:

openssl pkcs12 -export -out cert.pfx -inkey unencrypted.key -in cert.pem

相关内容