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
)时不会出现这个问题。