openssl - 不像 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 缺少什么参数????
解决方案
与所有事情一样,查看有关如何操作的文档是个好主意。
我可以想到 3 种方法来做到这一点。
在输入 pem 文件中包含所有链证书。这样你的命令就不需要改变,只需要你的输入。
使用“-certfile”选项指定您想要的其他证书。
例如 openssl pkcs12 -export -in domain.crt.pem -inkey domain.key.pem -certfile digicerts.pem -out domain.p12
- 使用“-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 文件,就像我在示例中所做的那样。
推荐阅读
- vue.js - 获取对 vue-router router-link 组件的引用
- php - 使用codeigniter上传生成的图片
- c++ - 返回最低节点的名称
- node.js - 即使 tsc 成功解决它,也找不到 Typescript 模块
- ios - CVCalendar - 更改圆形背景颜色
- python - 从 CSV 创建一个新列表
- excel - VBA Excel 创建带有时间戳的运行列表
- reactjs - 绑定 ListView 时出错
- c++ - 结构时间;与 tm 时间 = {}。输出相同但不一样?
- javascript - Ajax 调用返回 HTML 页面作为响应而不是呈现页面(Rails)