温馨提示:
本文所述内容不具普遍性,可能因操作环境差异而与实际有所出入,故请勿照搬照抄,仅供参考。
最近在配置 SSL 时出现了 nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "default.csr"
错误,解决方法比较简单,但却让人意想不到。
OCSP 与 CRL
出于某些原因,证书颁发者有时候需要作废某些证书。那么证书使用者(例如浏览器)如何知道一个证书是否已被作废呢?通常有两种方式:CRL(Certificate Revocation List,证书撤销名单)和 OCSP(Online Certificate Status Protocol,在线证书状态协议)。
CRL 是由证书颁发机构定期更新的一个列表,包含了所有已被作废的证书,浏览器可以定期下载这个列表用于验证证书合法性。不难想象,CRL 会随着时间推移变得越来越大,而且实时性很难得到保证。
OCSP 则是一个在线查询接口,浏览器可以实时查询单个证书的合法性。在每个证书的详细信息中,都可以找到对应颁发机构的 CRL 和 OCSP 地址。
OCSP 的问题在于,某些客户端会在 TLS 握手阶段进一步协商时,实时查询 OCSP 接口,并在获得结果前阻塞后续流程,这对性能影响很大。而 OCSP Stapling
(OCSP 封套),是指服务端在证书链中包含颁发机构对证书的 OCSP 查询结果,从而让浏览器跳过自己去验证的过程
。服务端有更快的网络,获取 OCSP 响应更容易,也可以将 OCSP 响应缓存起来。OCSP 响应本身经过了数字签名,无法伪造,所以 OCSP Stapling 技术既提高了握手效率,也不会影响安全性。
启用 OCSP
Nginx 配置中 SSL 段加入:
ssl_stapling on;
ssl_stalping_verify on;
问题分析
如果没有问题,那么测试配置应该响应如下:
[root@hw-gz default]# nginx -t
nginx: the configuration file /xxx/conf/nginx.conf syntax is ok
nginx: configuration file /xxx/conf/nginx.conf test is successful
如果出现如下响应,说明我们的配置是有问题的:
[root@hw-gz default]# nginx -t
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/xxx/key/default/default.csr"
nginx: the configuration file /xxx/conf/nginx.conf syntax is ok
nginx: configuration file /xxx/conf/nginx.conf test is successful
解决方法
1、原因:使用的证书是自签证书 或证书链不完整。
解决方法:配置中新增 ssl_trusted_certificate
配置,即:
ssl_trusted_certificate /path/to/ROOT_CA_CERT;
根据 OCSP 工作原理,如果配置的证书没有包含证书链(即签发 CA,从上到下依次为用户证书->中间 CA->根 CA),那么都应该加上这一行配置。
2、原因:证书 Cert 与私钥 Key不匹配。
解决方法:博主这次无法开启 ssl_stapling 的原因就是证书错误,并且通过 nginx -t
无法检测出该错误(ECC 证书+RSA 私钥,可能遇到 Bug 了),因此在配置 OCSP 时务必再次确认证书。
参考文章:
1、《TLS 握手优化详解》
2、《Improving SSL Configuration》
3、《从无法开启 OCSP Stapling 说起》
Windows 10Chrome 95.0.4638.54来自 湖南 的大神
我的出现这个问题,直接修改主机的/etc/resolv.conf中的DNS配置为
nameserver 211.142.211.124
nameserver 8.8.8.8,已经ok了。
Mac OS X 10_15_7Chrome 93.0.4577.63来自 湖北 的大神
阿里云的证书直接部署也会提示这个。 自己下载再安装就不会。
嗯,默认不会有证书链