為什麼在沒有明確根聲明的情況下,在 NGINX 上用於「buypass」DV 憑證的 OCSP 裝訂會失敗?

為什麼在沒有明確根聲明的情況下,在 NGINX 上用於「buypass」DV 憑證的 OCSP 裝訂會失敗?

太長了;博士

對於 certbot 取得的 buypass DV 證書,我需要明確告訴 NGINX 信任 buypass 根證書以啟用 OCSP 裝訂。 Let's Encrypt 憑證的情況並非如此,我不明白為什麼。我找到了一種方法(見下文),它看起來更像是一種解決方法,而不是一個可靠的解決方案。所以我想知道我在這裡做錯了什麼嗎?


細節

我注意到 buypass.com DV 證書(去SSL)透過 ACME 協定取得(透過證書機器人) NGINX 無法提供開箱即用的 OCSP,即使此類設定與 Let's Encrypt 憑證完美搭配:

ssl_stapling on;
ssl_stapling_verify on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot

我需要產生一個包含根憑證 ( Buypass_Class_2_Root_CA.pem) 的新鏈:

cp /etc/letsencrypt/live/example.com/
cat /etc/ssl/certs/Buypass_Class_2_Root_CA.pem fullchain.pem > ocsp-chain.pem

並明確指示 NGINX 信任該鏈:

ssl_trusted_certificate /etc/letsencrypt/live/example.com/ocsp-chain.pem;

讓我更困惑的是,我不必為 Let's Encrypt 憑證執行此操作,並且 NGINX 設法提供裝訂的 OCSP沒有必須產生額外的ocsp-chain.pem.


更多詳情(更新)

只是對生成的信任鏈進行一些澄清certbot

對於購買通行證:

/--------- fullchain.pem ---------\    /--- /etc/ssl/certs --\
example.com -> Buypass_Class_2_CA_5 -> Buypass_Class_2_Root_CA
               \---- chain.pem ---/

對於讓我們加密:

/--------- fullchain.pem --------\    / /etc/ssl/certs \
example.com -> Lets_Encrypt_R3.pem -> DST_Root_CA_X3.pem
               \---- chain.pem ---/

如果我執行以下命令:

cd /etc/letsencrypt/live/example.com
# $OSCP_URL is:
#   * Let's Encrypt: http://r3.o.lencr.org
#   * Buypass:       http://ocsp.buypass.com
openssl ocsp -issuer chain.pem -cert fullchain.pem -url "${OCSP_URL}"

我明白了Response verify OK。儘管如此,儘管nginx 用途openssl在信任所有錨點的引擎蓋下/etc/ssl/certs(在我的例子中/usr/lib/ssl/certs -> /etc/ssl/certs),如果沒有上述解決方法,它無法驗證 OCSP:

2611#2611: OCSP_basic_verify() failed (SSL: error:27069065:OCSP routines:OCSP_basic_verify:certificate verify error:Verify error:unable to get issuer certificate) while requesting certificate status, responder: ocsp.buypass.com, peer: 23.55.161.57:80, certificate: "/etc/letsencrypt/live/example.com/fullchain.pem"

答案1

更新

事實證明,OpenSSL 無法正確處理由指定機構(而非頒發者)簽署的 OCSP 回應。雖然 RFC 6960明確表示應僅使用頒發者憑證(也證明指定機構)來驗證 OCSP 回應,OpenSSL 不遵守這一點,並要求您明確包含根憑證。如果您使用 CLI,這會自動發生(使用-CAfile和的組合-noCApath來驗證這一點!)。

原答案

我花了相當長的時間才想出解決辦法!問題不在於 NGINX,而在於 OpenSSL。我發現如果 OCSP 是由指定回應者簽署的(請參閱RFC 6960),其憑證包含在 OCSP 回應中,OpenSSL 在驗證回應時無法考慮此附加憑證。我無法確切地說為什麼使用 OpenSSL OCSP CLI(即 )時不會出現此問題openssl ocsp -issuer x -cert y -url z

相關內容