先看现象。nginx 1.24 开了 ssl_stapling on 和 ssl_stapling_verify on,配好之后首次握手从 60ms 涨到 380ms,error.log 里是 OCSP response not found,过一阵又自己好了。
把日志和配置对完,能解释这个现象的基本就这几处。nginx 启动时同步去取 OCSP 响应,取不到就把握手一起阻塞。还有一种是resolver 配的是内网 DNS,解析不到 OCSP 地址里的公网主机。
还有一种情况,证书的 OCSP 地址本身响应慢,出口又被防火墙挡住。
另外,ssl_trusted_certificate 没配,签发者证书找不到,响应验不过。
动手时先看证书里的 OCSP 地址
openssl x509 -in cert.pem -noout -ocsp_uri
手工取一次响应看耗时
openssl ocsp -issuer chain.pem -cert cert.pem -url $(openssl x509 -in cert.pem -noout -ocsp_uri) -resp_text -noverify | head -20
接着配好 resolver 和信任链
printf '%s
' 'ssl_stapling on;' 'ssl_stapling_verify on;' 'ssl_trusted_certificate /etc/nginx/ssl/chain.pem;' 'resolver 223.5.5.5 119.29.29.29 valid=300s;' > /etc/nginx/conf.d/ocsp.conf
reload 后看 stapling 状态
nginx -t && nginx -s reload && echo | openssl s_client -connect 127.0.0.1:443 -status 2>/dev/null | grep -A2 'OCSP Response'
同一份数据我导出了两份,一份留底,一份拿来试。
这类问题以前遇到过,但这次的触发条件和上次不一样。
恢复的判定其实很直接。首次握手回到 80ms 以内,s_client 显示 OCSP Response Status: successful,error.log 不再有 OCSP 相关报错。
容易忽略的是,取不到响应时 nginx 会放行握手,但启动那一下是同步的,重启前先确认能连通 OCSP 地址;内网机器一定要配可用的 resolver。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
