无法“openssl验证”letsencrypt证书

无法“openssl验证”letsencrypt证书,ssl,openssl,lets-encrypt,certbot,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 我导航到生成的证

我使用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:

我可以看到链中有什么。pem:

我无法验证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
$ ca.pem fullchain.pem > cachain.pem
但我也无法验证fullchain.pem:

该证书似乎在浏览器中工作,但在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不能验证

与直觉相反,我最终通过向链中添加根证书使openssl验证工作。感觉Letsencrypt CA应该已经可用了,所以我不认为这是正确的做法,并欢迎评论

这些步骤是:

Chrome开发者工具>安全选项卡>查看证书>详细信息选项卡>选择根证书内置对象令牌:DST根CA X3 单击导出,导出为Base64编码的ASCII,单个证书我命名为ca.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
$ ca.pem fullchain.pem > cachain.pem
然后验证:

$ openssl verify cachain.pem
cachain.pem: OK
这感觉不对,所以我想知道这是否为假阳性。

我从man verify中了解到了这一点,阅读了对untrusted的描述。事实证明,untrusted实际上是您指定信任证书链的方式,当您这样说时,它似乎违反直觉

因此,验证Letsencrypt证书所需的命令是:

openssl verify -untrusted chain.pem cert.pem

其中cert.pem是您的证书,chain.pem是LE中间证书。没有必要为此使用fullchain.pem。

我为同一问题挣扎了3天。但该错误是由于Apache配置中的配置错误造成的

我通过命令openssl s_client-connect advertentiekracht发现了这一点。nl:443返回:

Certificate chain
 0 s:/CN=advertentiekracht.nl
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
无法获取本地颁发者证书

命令:[root@srvssl]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服务器配置。对我来说,这就是阿帕奇。我在定义SSL证书hocus pocus的地方有输入错误。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

我能够在新生成的证书上为任何域复制此内容。如果我生成一个证书,cd到…/live/example.com并运行openssl verify fullchain.pem,则在0深度查找时始终会出现错误20:无法获取本地颁发者证书/error fullchain.pem:verify failed.AIUI,openssl verify只读取文件中的第一个证书,因此,它不能用于验证一个完整的.p..考虑使用-无CAPATS避免使用系统通用信任存储…然后使用-CAfile-related-root-CA.crt在您的情况下DST root CA X3 untrusted感觉不正确,因为您想验证链,但随后说允许不受信任的中间层。取而代之的是从这里获取正确的根CA注意:它可能不是ISRG根X1,而是下面提到的TrustID X3根,那么openssl验证-CAfile不仅仅是验证根CA作为文件中第一个条目的有效性吗?
    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