使用OpenSSL将PKCS#12证书转换为PEM


212

我在Windows 7上安装了OpenSSL x64,是从Google Code上的openssl-for-windows下载的。我正在尝试运行:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

但我得到一个错误。

unable to load private key

如何使用OpenSSL从PKCS#12存储提取PEM中的证书?


@jww我认为,鉴于这个问题已有3年以上的历史了,发出离题信号已经有点晚了。
Dean MacGregor

只是一种形式,使人们知道它的题外话。人们在问同样的题外问题,并引用了这个问题。如果人们没有被告知其题外话,那么他们将继续询问Stack Overflow。
jww

2
@jww在链接的元问题上获得最高投票的答案是:“应在堆栈溢出中允许使用DevOps问题。” 我会投票赞成,因为答案满足了我的需要(尽管对我来说,我不是在编程,如果愿意,我可以轻松地将答案合并到程序中)
dcorking

Answers:


534

尝试:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

之后,您将拥有:

  • newfile.crt.pem中的证书
  • newfile.key.pem中的私钥

要将证书和密钥放在同一文件中,请使用以下命令

openssl pkcs12 -in path.p12 -out newfile.pem

如果您需要直接从命令行(例如脚本)输入PKCS#12密码,只需添加-passin pass:${PASSWORD}

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'

2
私钥和证书是否可能存储在同一* .pem文件中?
拉米斯2015年

18
是的,它是:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee

2
询问输入密码。那是什么 ?
Saurabh Chandra Patel

4
@SaurabhChandraPatel,您必须知道证书的密码。这不是恢复忘记的密码的方法
Dean MacGregor

2
省略-nodes,不会提取私钥。
Meixner

22

您只需要提供一个密码。您可以在同一命令行中使用以下语法进行操作:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

然后将提示您输入密码,以加密输出文件中的私钥。如果要导出未加密的私钥(明文),请在上一行中包含“节点”选项:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

更多信息:http : //www.openssl.org/docs/apps/pkcs12.html


16

如果您可以使用Python,那么拥有该pyopenssl模块将更加容易。这里是:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())

有没有使用file和不打开文件的理由open?我只是想了解它,以备将来使用(以简化将openssh作为命令调用的解决方案)
Jan Vlcinsky 2014年

不,没有区别。你可以做open("push.p12", 'rb').read()
KVISH

2
如果使用python 3,您可能需要将内容写入文件:with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))写入证书和with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))密钥。
亚当·帕金

我正在使用python 3.7,运行上面的示例时,得到以下信息:“ TypeError:ctype'char'的初始化程序的字节长度必须为1,而不是str”我的密码有问题吗
getaglow

为什么创建文件,输入代码,保存并运行它“甚至更容易”,而不是仅仅执行一个命令?
Torben Gundtofte-Bruun

3

我有一个PFX文件,需要为NGINX创建KEY文件,所以我这样做了:

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

然后,我必须编辑KEY文件并删除所有内容-----BEGIN PRIVATE KEY-----。之后,NGINX接受了KEY文件。


0

如果您需要没有任何密码的PEM文件,则可以使用解决方案。

只需将私钥和证书复制并粘贴到同一文件中,然后另存为.pem。

该文件将如下所示:

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

这是我发现将证书上传到Cisco设备以进行HTTPS的唯一方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.