将包含所有证书链的P7b文件导出为CER文件。

50

我有一个由 Thwate 提供的 p7b 文件。当我尝试使用以下命令导出 cer 文件中的证书时,证书链不包括在内。
请建议如何做到相同效果。导入到 Weblogic 密钥库需要此 CER。

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
6个回答

76

-print_certs是您想要使用的选项,以列出p7b文件中的所有证书,您可能需要指定您正在读取的p7b文件的格式。

然后,您可以将输出重定向到一个新文件中,以构建证书的串联列表。

在文本编辑器中打开该文件,您将看到Base64(PEM)或二进制数据(DER)。

openssl pkcs7 -inform DER -outform PEM -in certificate.p7b -print_certs > certificate_bundle.cer

http://www.openssl.org/docs/apps/pkcs7.html


2
只是为了澄清如何确定 p7b 文件的格式,当您在文本编辑器中打开文件时,如果您看到“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”字符串嵌入在无意义的字符中时,它可能是Base64(PEM)格式。否则,如果它是100%的无意义字符,那么它很可能是二进制(DER)格式。我从以下链接中获取了此信息: https://knowledge.digicert.com/solution/SO26449.html - Van Vangor
我不得不使用openssl pkcs7 -outform PEM -in user.anaplanfrsysdev.p7b -print_certs从.p7b文件中提取了2个证书。 - user674669
1
openssl pkcs7 -inform DER -outform PEM -in certificate.p7b -print_certs -out certificat_bundle.cer也应该可以正常工作。它使用了openssl本身的选项。 - Zailux

12
所选答案对我没用,但很接近。我找到了一篇教程,成功获取了StartCom证书。
  1. Open the .p7b in a text editor.
  2. Change the leader and trailer so the file looks similar to this:

    -----BEGIN PKCS7-----
    [... certificate content here ...]
    -----END PKCS7-----
    
例如,我的StartCom证书以此开始:
    -----BEGIN CERTIFICATE----- 

并以以下内容结束:
    -----END CERTIFICATE----- 
  1. Save and close the .p7b.
  2. Run the following OpenSSL command (works on Ubuntu 14.04.4, as of this writing):

    openssl pkcs7 -print_certs –in pkcs7.p7b -out pem.cer
    
输出的是一个带有证书链的.cer文件。
参考资料:http://www.freetutorialssubmit.com/extract-certificates-from-P7B/2206

不得不这样做是为了让“keytool”识别证书。非常感谢! - adonese

5
唯一的问题是,任何附加证书都不会被识别为结果文件中的证书,因为工具不会期望每个PEM/DER编码文件中有多个证书。即使是openssl本身也是如此。请尝试:
openssl x509 -outform DER -in certificate.cer | openssl x509 -inform DER -outform PEM

并且亲自去尝试一下,看看效果如何。

1
一个连接的中间证书列表对于使用SSLCACertificateFile配置参数执行X.509客户端身份验证的Apache httpd Web服务器非常有用。从apache httpd-ssl.conf文件中: 设置CA证书验证路径,以查找用于客户端身份验证的CA证书,或者替代地使用包含所有CA证书的一个巨大文件(文件必须是PEM编码)。 - bcarroll

1

我曾经遇到过从文件中提取证书的类似问题。这可能不是最好的方法,但对我有效。

openssl pkcs7 -inform DER -print_certs -in <path of the file> | awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'

1

6
这个问题询问的是PKCS7文件,而不是PKCS12文件。 - s29

0
一种@Magnus答案的版本,将每个证书保存到单独的文件中,同时也剥离头部信息。
openssl pkcs7 -inform DER -in root.p7b -print_certs | awk '/^-+BEG/{n++;s=1}s{print>"root_"n".crt"}/^-+END/{s=0}'

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