[最初发布在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 0.9.8zh 14 Jan 2016
不是那么老......
openssl version
单产OpenSSL 0.9.8zh 14 Jan 2016
我的本地计算机上运行塞拉利昂,但它实际上产生LibreSSL 2.2.7
本证书脚本运行的服务器(高塞拉利昂)上。那么也许这是LibreSSL中的一个错误?我应该更新标题和标签,但首先我会在今晚测试它,看看行为是否不同。