无法“openssl verify' letsencrypt证书

时间:2018-06-11 17:28:03

标签: ssl openssl lets-encrypt certbot

我使用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.pemcert.pemchain.pem的串联。

所以:我不明白为什么fullchain.pem无法验证?

3 个答案:

答案 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应该已经可用,所以我不相信这是正确的做法(并欢迎评论)。

步骤是:

  • Chrome开发者工具>安全选项卡>查看证书>详细信息标签>选择根证书(“内置对象令牌:DST根CA X3”)
  • 单击导出,导出为Base64编码的ASCII,单个证书(我将其命名为ca.pem

将根连接到链:

$ ca.pem fullchain.pem > cachain.pem

然后验证:

$ openssl verify cachain.pem
cachain.pem: OK

这感觉“错误”,所以我想了解这是否是误报。