使用openssl将pfx转换为pem

199
如何使用OpenSSL从PFX文件生成.pem格式的CA证书和客户端证书。
5个回答

287

在 Linux 上另一个处理方式的视角... 这里是如何操作,使得生成的单个文件包含了解密后的私钥,这样像 HAProxy 这样的程序就可以使用它而不需要提示输入密码。

openssl pkcs12 -in file.pfx -out file.pem -nodes

然后你可以配置HAProxy使用file.pem文件。


这是对之前版本的编辑,在此之前我列出了多个步骤,直到我意识到-nodes选项只是简单地绕过了私钥加密。但我将其保留在此处,因为它可能有助于教学。

openssl pkcs12 -in file.pfx -out file.nokey.pem -nokeys
openssl pkcs12 -in file.pfx -out file.withkey.pem
openssl rsa -in file.withkey.pem -out file.key
cat file.nokey.pem file.key > file.combo.pem
  1. 第1步提示您输入密码以打开PFX文件。
  2. 第2步要求您除了密码外,还需设定一个密钥口令。
  3. 第3步要求您输入刚刚创建的密钥口令以储存解密后的文件。
  4. 第4步将所有内容合并到一个文件中。

然后,您可以配置HAProxy使用file.combo.pem文件。

需要在两个不同的步骤中指定带有密钥和不带密钥的文件,原因是如果您有一个同时包含加密和解密密钥的文件(如HAProxy),在使用它时仍会提示您键入密码。


1
我还没有花时间深入了解openssl,但pem转换并没有包括私钥。这个编辑提供了详细的合并证书和密钥到一个pem文件中的方法,正是我所需要的。 - ebt
3
在Windows系统中,使用"type"代替"cat"。 - hupseb
2
在Windows上,这个版本的OpenSSL很容易用于处理这样的事情:http://slproweb.com/products/Win32OpenSSL.html - Helge Klein
1
以上步骤很好地将PFX转换为PEM。但是我还需要执行一个额外的步骤:在文本编辑器中打开nokey PEM文件,并将证书链中的最后一个证书移动到文件顶部。否则,nginx会抛出关于证书的错误并拒绝使用它们。 - EugeneRomero
在这种情况下,您可以重新排列cat命令,将其放在第一位。例如: cat file.key file.nokey.pem > file.combo.pem,除非file.key本身有多个顺序错误。但无论哪种情况,您都可以通过编程方式进行重新排列。 - user2415376
显示剩余3条评论

143

您可以使用OpenSSL命令行工具。以下命令应该能解决问题。

openssl pkcs12 -in client_ssl.pfx -out client_ssl.pem -clcerts

openssl pkcs12 -in client_ssl.pfx -out root.pem -cacerts

如果您希望对文件进行密码保护等操作,则有其他选项。

您可以在此处阅读完整的文档here


1
仅当我使用 "C:\Program Files\Git\usr\bin\openssl.exe" 中的 OpenSSL .exe 时,此方法才适用于 Windows。当我从 Git Bash 使用 openssl 时,会出现“openssl pfx to pem error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong”错误。 - Chris Halcrow
外部引用不起作用,这里是更新的URL.. - Shekar Kola

99

尽管其他答案都是正确且详细解释的,但我在理解它们时遇到了一些困难。这里是我使用的方法(来自这里):

第一种情况: 将 PFX 文件转换为包含证书和私钥的 PEM 文件:

openssl pkcs12 -in filename.pfx -out cert.pem -nodes

第二种情况:将PFX文件转换为单独的公钥和私钥PEM文件:

从PFX中提取私钥至PEM文件:

openssl pkcs12 -in filename.pfx -nocerts -out key.pem

导出证书 (仅包括公钥):

openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem

从提取的私钥中删除密码(解释)(可选):

从提取的私钥中去除密码(换句话说)(可选):

openssl rsa -in key.pem -out server.key

4
在第一种情况下,即使原始证书没有密码,我仍会被提示输入密码。 - openCivilisation
9
您可以在 pkcs12 后面加上 -nodes 来禁用 key.pem 的 PEM 密码设置。这样做可以使内容更加通俗易懂,但不改变原来的意思。 - leonheess
2
如果有人不明白,-nodes 的意思是“无 des”,而不是英语单词“note”。请参见 https://dev59.com/KG445IYBdhLWcg3wE2Re。 - Lionet Chen

6

您可以使用以下方法从.pfx文件中提取根证书,.crt证书和.key密钥。

# Extracting ca-certs..."
  openssl pkcs12 -in ${filename}.pfx -nodes -nokeys -cacerts -out ${filename}-ca.crt

# Extracting key file..."
  openssl pkcs12 -in ${filename}.pfx -nocerts -out ${filename}.key

# Extracting crt..."
  openssl pkcs12 -in ${filename}.pfx -clcerts -nokeys -out ${filename}.crt

# combine ca-certs and cert files
  cat  ${filename}.crt ${filename}-ca.crt > ${filename}-full.crt

# Removing passphrase from keyfile"
  openssl rsa -in ${filename}.key -out ${filename}.key

链接: https://gist.github.com/mediaupstream/a2694859b1afa59f26be5e8f6fd4806a 此链接为一个Github的代码库,包含相关IT技术方面的内容。

1

对于使用密码锁定的PFX

建议在一个命令中结合密码参数和转换操作,以避免错误。

例如: 此命令用于提取私钥。

openssl pkcs12 -in "blablabla.pfx" -out key.key -nodes -passin pass:blablabla   

同时该命令还可用于提取公钥。

openssl pkcs12 -in "blablabla.pfx" -clcerts -nokeys -out crt.crtpem -nodes -passin pass:blablabla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接