簡體   English   中英

無法“openssl verify”letsencrypt證書

[英]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.pemcert.pemchain.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應該已經可用,所以我不相信這是正確的做法(並歡迎評論)。

步驟是:

  • Chrome開發者工具>安全選項卡>查看證書>詳細信息選項卡>選擇根證書(“內置對象令牌:DST根CA X3”)
  • 單擊導出,導出為Base64編碼的ASCII,單個證書(我將其命名為ca.pem

將根連接到鏈:

$ ca.pem fullchain.pem > cachain.pem

然后驗證:

$ openssl verify cachain.pem
cachain.pem: OK

這感覺“錯誤”,所以我想了解這是否是誤報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM