首页 > 解决方案 > 不像 Windows 那样制作 openssl p12 证书

问题描述

我用 openssl 创建我的证书:

openssl pkcs12 -export -in domain.crt.pem -inkey domain.key.pem -certfile domain.cha.pem -chain -CAfile domain.cha.pem -out domain.p12

或者

openssl pkcs12 -export -in domain.crt.pem -inkey domain.key.pem -chain -CAfile domain.cha.pem -out domain.p12

或者

openssl pkcs12 -export -in domain.crt.pem -inkey domain.key.pem -certfile domain.cha.pem -out domain.p12

或(带有 ca 证书domain.crt.pem

openssl pkcs12 -export -in domain.crt.pem -inkey domain.key.pem -out domain.p12

将它用于我的 smtp 网关证书链不存在

echo | openssl s_client -crlf -connect smtp.domain.de:25 -starttls smtp -servername

smtp.domain.de | openssl x509 -noout -dates
depth=0 CN = smtp.domain.de
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = smtp.domain.de
verify error:num=21:unable to verify the first certificate
verify return:1
250 HELP
DONE
notBefore=Apr 22 00:00:00 2021 GMT
notAfter=Mar 14 23:59:59 2022 GMT

但是如果将此 p12 文件导入 Windows 并导出所有证书,我会得到

echo | openssl s_client -crlf -connect smtp.domain.de:25 -starttls smtp -servername smtp.domain.de | openssl x509 -noout -dates

depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Encryption Everywhere DV TLS CA - G1
verify return:1
depth=0 CN = smtp.domain.de
verify return:1
250 HELP
DONE
notBefore=Apr 22 00:00:00 2021 GMT
notAfter=Mar 14 23:59:59 2022 GMT

为了纠正这个问题,openssl 缺少什么参数????

标签: openssl

解决方案


与所有事情一样,查看有关如何操作的文档是个好主意。

我可以想到 3 种方法来做到这一点。

  1. 在输入 pem 文件中包含所有链证书。这样你的命令就不需要改变,只需要你的输入。

  2. 使用“-certfile”选项指定您想要的其他证书。

例如 openssl pkcs12 -export -in domain.crt.pem -inkey domain.key.pem -certfile digicerts.pem -out domain.p12

  1. 使用“-chain”和 -CAfile/-CApath/configsetup 从 CA 存储中提取链。

例如 openssl pkcs12 -export -in domain.crt.pem -inkey domain.key.pem -chain -out domain.p12

(假设您的 openssl 的默认 ca 存储设置)或

例如 openssl pkcs12 -export -in domain.crt.pem -inkey domain.key.pem -chain -CAfile cacert.pem -out domain.p12

提供一个 ca 存储 (cacert.pem),其中包含构成所需链的所有必需证书。

============== 更新 =================

我有一个 www.example.com 的示例证书链,链为: www.example.com XXXX Development Intermediate CA XXXX Development CA

它们在文件中:

www.example.com.cert.pem - the www.example.com certificate
www.example.com.key.pem - the www.example.com certificate key
intermediate.pem - the XXXX Development Intermediate CA certificate
ca.pem - the XXXX Development CA certificate

当我进行验证时,我得到:

openssl verify -show_chain -untrusted intermediate.pem -CAfile ca.pem www.example.com.cert.pem
.\www.example.com.cert.pem: OK
Chain:
depth=0: C = NZ, ST = Auckland, L = Auckland, O = XXXX, CN = www.example.com, emailAddress = shane.powell@xxxx.com (untrusted)
depth=1: C = NZ, ST = Auckland, O = XXXX, CN = XXXX Development Intermediate CA, emailAddress = shane.powell@xxxx.com
depth=2: C = NZ, ST = Auckland, L = Auckland, O = XXXX, CN = XXXX Development CA, emailAddress = shane.powell@xxxx.com

示例 1:

将三个文件合并为一个文件。它们只是文本文件,因此可以以任何您想要的方式组合它们。
电源外壳示例:

dir www.example.com.cert.pem,intermediate.pem,ca.pem | gc | out-file www.example.com.all.pem

创建 p12 文件:

openssl pkcs12 -export -in www.example.com.all.pem -inkey www.example.com.key.pem -out www.example.com.p12

示例 2:

创建 p12 文件:

openssl pkcs12 -export -in www.example.com.cert.pem -inkey www.example.com.key.pem -certfile intermediate.pem -certfile ca.pem -out .\www.example.com.p12

示例 3:

使用 powershell 生成带有中间证书和 ca 证书的 ca 存储文件,它再次只是组合文本文件,因此可以根据需要进行操作:

dir intermediate.pem,ca.pem | gc | out-file ca-all.pem

创建 p12 文件:

openssl pkcs12 -export -in www.example.com.cert.pem -inkey www.example.com.key.pem -chain -CAfile ca-all.pem -out www.example.com.p12

使用上述示例中的任何www.example.com.p12输出文件,我可以使用以下命令进行验证:

openssl pkcs12 -in www.example.com.p12 -info -nodes | openssl verify -show_chain -CAfile ca.pem
Enter Import Password:
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Certificate bag
Certificate bag
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
stdin: OK
Chain:
depth=0: C = NZ, ST = Auckland, L = Auckland, O = XXXX, CN = www.example.com, emailAddress = shane.powell@xxxx.com (untrusted)
depth=1: C = NZ, ST = Auckland, O = XXXX, CN = XXXX Development Intermediate CA, emailAddress = shane.powell@xxxx.com
depth=2: C = NZ, ST = Auckland, L = Auckland, O = XXXX, CN = XXXX Development CA, emailAddress = shane.powell@xxxx.com

现在要将上述内容应用于您的示例,您拥有证书 pem 和密钥 pem,并且需要获取正确的中间 pem 和根 ca pem 文件。这些通常由颁发证书的 CA 提供。您也可以使用谷歌手动完成。

您的中间证书是:“Encryption Everywhere DV TLS CA - G1”。搜索“digicert Encryption Everywhere DV TLS CA-G1”会得到这个页面

我会下载“Encryption Everywhere DV TLS CA - G1”证书的“PEM”版本。在同一页面上,您还可以下载“DigiCert Global Root CA”PEM 文件。

使用上面的“openssl verify”命令示例,我将验证我是否拥有正确的中间证书和根证书。

使用上述任何示例创建 p12 文件(此时示例 2 对我来说似乎更容易)。

然后我将使用“openssl pkcs12 | openssl verify”命令验证 p12 文件,就像我在示例中所做的那样。


推荐阅读