为什么openssl pkcs12导出添加额外的根锚证书,在Mac OS X上复制服务器证书


1

[最初发布在Slack Overflow上,但评论主题抱怨不适当的场地。]

我们正在努力从StartCom SSL证书切换到Let's Encrypt,并尝试将其设置为自动使用macOS Server + Apache HTTPD。从命令行工具(security import),macOS Server不接受直接.pem文件 - 您必须为其提供一个.p12文件,从中提取.pem要在Apache中配置的文件。烦人而无意义,但这是我们现在必须要忍受的。

为了创建这个.p12文件,我们必须执行这个命令:

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/cert.pem \
-certfile /etc/letsencrypt/live/example.com/chain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

这就是它变得怪异的地方。输出example.com.p12文件有两次example.com证书,然后是Let's Encrypt中间CA证书,然后是不必要的自签名DST根CA X3锚证书(默认情况下所有浏览器都安装在其中),最后是私钥。结果是Apache SSL握手包括服务器证书两次,中间CA证书和根证书(它不应该发送),这会导致Qualys SSL Labs测试人员发出警告。

我们查看了内部cert.pem,它只包含服务器证书(只有一次)。chain.pem仅包含中间CA证书(不是根锚或服务器证书)。privkey.pem仅包含私钥。因此openssl pkcs12 -export,重复服务器证书,然后进入查找根锚证书并添加它的额外步骤。

如果我们在openSUSE Linux上运行相同的命令,则输出.p12文件只有服务器证书(一次),中间CA证书和私钥。没有根锚。

我们尝试了以下变化,并看到输出没有差异:

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-certfile /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

我可以在Linux机器上复制不正确的双服务器证书行为的唯一方法是执行以下操作(但它仍然不包括根锚):

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/cert.pem \
-certfile /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

(注意使用fullchain.pem而不是chain.pem结合使用cert.pem...完全理解为什么服务器证书会被复制,但这不是我们在Mac OS X上使用的命令。)

知道如何在openssl pkcs12 -export这里做正确的事吗?


您是否尝试过安装和运行现代版本的OpenSSL(可能通过MacPorts或Homebrew)?Apple拥有自己的安全库,并且在很长一段时间内都没有向OpenSSL展示任何爱。
Spiff

我们还没有尝试过。我担心在通过安全检查的其他工作配置中升级OpenSSL。然而,OpenSSL 0.9.8zh 14 Jan 2016不是那么老......
尼克威廉姆斯

“在High Sierra,Apple已将SSL库从OpenSSL 0.9.8zh切换到LibreSSL 2.2.7。LibreSSL是OpenBSD支持的OpenSSL的一个分支。Secure Transport是Apple自己的SSL / TLS API,但它主要用于第一方软件。LibreSSL将作为第三方软件的SSL库。这不包括在任何WWDC会议中,但是已被High Sierra beta用户观察到。“(thesslstore.com/blog/crypto-ssl-improvements-high-sierra-ios-11
Nick Williams

openssl version单产OpenSSL 0.9.8zh 14 Jan 2016我的本地计算机上运行塞拉利昂,但它实际上产生LibreSSL 2.2.7本证书脚本运行的服务器(高塞拉利昂)上。那么也许这是LibreSSL中的一个错误?我应该更新标题和标签,但首先我会在今晚测试它,看看行为是否不同。
尼克·威廉姆斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.