我有一个 PKCS12 文件,其中包含完整的证书链和私钥。我需要将它分成 3 个文件作为一个应用程序。我需要的3个文件如下(PEM格式):
- 未加密的密钥文件
- 客户端证书文件
- CA 证书文件(根证书和所有中间证书)
这是我必须执行的一项常见任务,因此我正在寻找一种无需手动编辑输出即可完成此操作的方法。
我尝试了以下方法:
openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain -out <cacerts.cer>
这工作正常,但是,输出包含包属性,应用程序不知道如何处理这些属性。
经过一番搜索后,我找到了一个建议的解决方案,即通过 x509 传递结果来剥离包属性。
openssl x509 -in <clientcert.cer> -out <clientcert.cer>
这可行,但我在 cacert 文件上遇到了问题。输出文件仅包含链中 3 个证书之一。
有没有办法避免在 pkcs12 命令的输出中包含包属性,或者让 x509 命令输出包含所有证书?此外,如果通过 x509 运行它是最简单的解决方案,是否有办法将 pkcs12 的输出通过管道传输到 x509,而不是将文件写出两次?
答案1
我最终找到的解决方案是通过 sed 进行管道传输。
openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>
答案2
另一种解决方案没有sed
:
openssl pkcs12 -in <filename.pfx> -nocerts -nodes | openssl pkcs8 -nocrypt -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | openssl x509 -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>
答案3
单线awk
:
openssl pkcs12 -in key.pfx -nodes -out - | awk '/-----BEGIN/{a=1}/-----END/{print;a=0}a'
这将丢弃不在 PEM 开始行和结束行之间的所有输出。 AWK 的功劳在于https://stackoverflow.com/q/17988756#comment29487454_17988834
答案4
刚刚尝试使用
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>
以纯格式导出链,而无需链中每个项目的标题。在这台 Windows NT 服务器上,我只导出了链中的第一项,而不是我期望的两项。相反,我只是最终使用
openssl pkcs12 -in <filename.pfx> -cacerts -chain -nokeys -nodes -out <cacerts.cer>
并使用记事本编辑文件以删除不需要的文本。不优雅?是的,但它得到了所需的结果。