我使用Certbot容器与Letsencrypt建立证书:
$ mkdir /home/$USER/letsencrypt
$ docker run -it --rm -p 80:80 -p 443:443 -v /home/$USER/letsencrypt:/etc/letsencrypt certbot/certbot certonly --standalone --email user@example.com --agree-tos -d example.com
我导航到生成的证书:
$ cd /home/$USER/letsencrypt/live/example.com
我可以验证chain.pem
:
$ openssl verify chain.pem
chain.pem: OK
我可以看到chain.pem
中的内容:
$ openssl x509 -noout -in chain.pem -subject -issuer
subject=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
issuer=O = Digital Signature Trust Co., CN = DST Root CA X3
我无法验证cert.pem
(可能是因为它需要链条):
$ openssl verify cert.pem
CN = example.com
error 20 at 0 depth lookup: unable to get local issuer certificate
error cert.pem: verification failed
但我也无法验证fullchain.pem
:
$ openssl verify fullchain.pem
CN = example.com
error 20 at 0 depth lookup: unable to get local issuer certificate
error fullchain.pem: verification failed
证书似乎在浏览器中有效,但在curl
(以及Android http客户端,这是真正的问题)失败了:
$ curl https://example.com
curl: (60) SSL certificate problem: unable to get local issuer certificate
我已经仔细检查fullchain.pem
是cert.pem
和chain.pem
的串联。
所以:我不明白为什么fullchain.pem
无法验证?
答案 0 :(得分:2)
我从man verify
了解到这一点,阅读untrusted
的说明。事实证明untrusted
实际上是你如何指定证书信任链(当你这样说的时候似乎违反直觉)。
因此,验证Letsencrypt证书所需的命令是:
openssl verify -untrusted chain.pem cert.pem
cert.pem
是您的证书,chain.pem
是LE中间证书。没有必要使用fullchain.pem
。
答案 1 :(得分:1)
我在同一问题上苦苦挣扎了3天。但是该错误是由于我的Apache配置中的配置错误导致的。
我通过Command openssl s_client -connect advertentiekracht.nl:nl:443发现:
Certificate chain
0 s:/CN=advertentiekracht.nl
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
包含“无法获得本地发行者证书”
命令:[root @ srv ssl]#openssl x509 -noout -in /etc/letsencrypt/live/advertentiekracht.nl/chain.pem -subject -issuer 显示出丢失的链条:
subject= /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
issuer= /O=Digital Signature Trust Co./CN=DST Root CA X3
我当然不熟悉openssl和证书。当然,可能有很多原因导致“无法获得本地发行者证书。但是在像我一样开始挖掘之前,请检查您的http服务器配置。对我来说,这是Apache。我有错别字SSL证书中心位置的定义位置。httpd标记了以下错误行
SSLCertificateFile /etc/letsencrypt/live/advertentiekracht.nl/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/advertentiekracht.nl/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
请注意第一行SSLCertificateFile应该是SSLCertificateChainFile,但我错过了对cert.pem和chain.pem的引用。下面的行解决了我的问题:
SSLCertificateChainFile /etc/letsencrypt/live/advertentiekracht.nl/fullchain.pem
SSLCertificateFile /etc/letsencrypt/live/advertentiekracht.nl/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/advertentiekracht.nl/chain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/advertentiekracht.nl/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
结果,完整的链:
Certificate chain
0 s:/CN=advertentiekracht.nl
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
答案 2 :(得分:0)
违反直觉,我最终通过将根证书添加到链中来使openssl verify
工作。感觉Letsencrypt CA应该已经可用,所以我不相信这是正确的做法(并欢迎评论)。
步骤是:
ca.pem
)将根连接到链:
$ ca.pem fullchain.pem > cachain.pem
然后验证:
$ openssl verify cachain.pem
cachain.pem: OK
这感觉“错误”,所以我想了解这是否是误报。