nginx解决"ssl_stapling" ignored, no OCSP responder URL in the certificate
OCSP 则是一个在线查询接口,浏览器可以实时查询单个证书的合法性。在每个证书的详细信息中,都可以找到对应颁发机构的 CRL 和 OCSP 地址。
OCSP 的问题在于,某些客户端会在 TLS 握手阶段进一步协商时,实时查询 OCSP 接口,并在获得结果前阻塞后续流程,这对性能影响很大。而 OCSP Stapling
(OCSP 封套),是指服务端在证书链中包含颁发机构对证书的 OCSP 查询结果,从而让浏览器跳过自己去验证的过程
。服务端有更快的网络,获取 OCSP 响应更容易,也可以将 OCSP 响应缓存起来。OCSP 响应本身经过了数字签名,无法伪造,所以 OCSP Stapling 技术既提高了握手效率,也不会影响安全性。
启用 OCSP 的相关配置
1 2 3 4 5 6 7 8 9 10 |
server { # use Google's DNS resolver 8.8.4.4 8.8.8.8 valid=300s; resolver_timeout 10s; ssl_stapling on; ssl_stapling_verify on; ## verify chain of trust of OCSP response using Root CA and Intermediate certs ssl_trusted_certificate /usr/local/nginx/ssl/nginx.cn/ca.cer; } |
ssl_trusted_certificate 选项应指向证书颁发结构的中间证书+根证书,而不是购买的ssl证书。否则会报:"ssl_stapling" ignored, no OCSP responder URL in the certificate。
报错1:报nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "default.csr" 错误。
打开两个 on 的同时要带着 ssl_trusted_certificate 配置。
报错2:
1 |
"ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/usr/local/nginx/ssl/domain.pem" |
解决方式:加 hosts
23.205.154.146 ocsp.int-x3.letsencrypt.org
检查是否生效
执行下面命令:
1 |
openssl s_client -connect blog.redis.com.cn:443 -showcerts < /dev/null 2>&1 |
返回:
1 2 3 |
Start Time: 1589375556 Timeout : 300 (sec) Verify return code: 18 (self signed certificate) |
Verify return code: 18。是因为SNI的原因(SERVER NAME INDICATION),SNI允许一个IP可以申请多个域名的证书。
验证证书的时候需要指明证书对应的域名,否则就会返回默认证书,也就是上面的自签名证书。
正确方式,使用参数-servername指明要测试的域名:
1 |
openssl s_client -connect blog.redis.com.cn:443 -showcerts -servername blog.redis.com.cn < /dev/null 2>&1 |
返回如下配置表示生效
1 2 3 |
Start Time: 1589375832 Timeout : 300 (sec) Verify return code: 0 (ok) |