总结
对于 certbot 获取的 buypass DV 证书,我需要明确告诉 NGINX 信任 buypass 根证书以启用 OCSP 装订。但 Let's Encrypt 证书并非如此,我不明白为什么。我找到了一种方法(见下文),它看起来更像是一种变通方法,而不是可靠的解决方案。所以我想知道我在这里做错了什么吗?
细节
我注意到 buypass.com DV 证书(转到 SSL)通过 ACME 协议获取(通过certbot)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
:
对于 Buypass:
/--------- fullchain.pem ---------\ /--- /etc/ssl/certs --\
example.com -> Buypass_Class_2_CA_5 -> Buypass_Class_2_Root_CA
\---- chain.pem ---/
对于 Let's Encrypt:
/--------- 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 6960openssl ocsp -issuer x -cert y -url z
),其证书包含在 OCSP 响应中,OpenSSL 在验证响应时未能考虑此附加证书。我无法确切地说出为什么在使用 OpenSSL OCSP CLI(即)时不会出现此问题。