[英]Unable to `openssl verify' letsencrypt certificate
我使用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
不驗證?
我從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 @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
與直覺相反,我最終通過將根證書添加到鏈中來進行openssl verify
。 感覺Letsencrypt CA應該已經可用,所以我不相信這是正確的做法(並歡迎評論)。
步驟是:
ca.pem
) 將根連接到鏈:
$ ca.pem fullchain.pem > cachain.pem
然后驗證:
$ openssl verify cachain.pem
cachain.pem: OK
這感覺“錯誤”,所以我想了解這是否是誤報。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.