无法“openssl 验证”letsencrypt 证书

Dav*_*oni 4 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
Run Code Online (Sandbox Code Playgroud)

我导航到生成的证书:

$ cd /home/$USER/letsencrypt/live/example.com
Run Code Online (Sandbox Code Playgroud)

我可以验证chain.pem

$ openssl verify chain.pem 
chain.pem: OK
Run Code Online (Sandbox Code Playgroud)

我可以看到里面有什么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
Run Code Online (Sandbox Code Playgroud)

我无法验证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
Run Code Online (Sandbox Code Playgroud)

但我也无法验证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
Run Code Online (Sandbox Code Playgroud)

该证书似乎在浏览器中工作,但失败curl(以及 Android http 客户端,这是真正的问题):

$ curl https://example.com
curl: (60) SSL certificate problem: unable to get local issuer certificate
Run Code Online (Sandbox Code Playgroud)

我已经仔细检查过它fullchain.pemcert.pemand的串联chain.pem

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

Dav*_*oni 6

我从man verify阅读untrusted. 结果untrusted这实际上是您指定证书信任链的方式(这样说似乎违反直觉)。

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

openssl verify -untrusted chain.pem cert.pem
Run Code Online (Sandbox Code Playgroud)

cert.pem您的证书在哪里,chain.pem是 LE 中级证书。没有必要为此使用fullchain.pem