[起初发布在 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 Root 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
在这里做正确的事情吗?