Nginx

為什麼在沒有明確的根聲明的情況下,在 NGINX 上為“購買通行證”DV 證書裝訂的 OCSP 會失敗?

  • January 10, 2021

tl;博士

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


細節

我注意到,對於通過 ACME 協議(通過certbot )獲取的 buypass.com DV 證書( GO SSL ), 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"

更新

事實證明,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)時不會出現這個問題。

引用自:https://serverfault.com/questions/1047810