OCSP Stapling 由 Nginx 主动向 CA OCSP 响应器发起 HTTP 请求获取并缓存证书状态响应,触发时机包括启动/重载时首次预取、缓存过期后异步刷新、以及客户端携带 status_request 扩展时提供已缓存响应。

当浏览器访问 HTTPS 网站时,会主动检查服务器证书是否已被吊销,常用机制是 OCSP(Online Certificate Status Protocol)或 CRL(Certificate Revocation List)。Nginx 本身不直接执行 OCSP 查询,但若配置了 ssl_stapling on 并启用 OCSP Stapling,它需向 CA 的 OCSP 响应服务器发起请求——而一旦该请求超时或失败,就可能拖慢 TLS 握手,造成页面加载卡顿甚至白屏数秒。
OCSP Stapling 是怎么被触发的
OCSP Stapling 是由 Nginx 主动向证书签发机构(如 Let’s Encrypt、Sectigo)的 OCSP 响应器发起 HTTP 请求,获取并缓存证书状态签名响应。该过程发生在:
- Nginx 启动或重载时,首次预取 OCSP 响应;
- 缓存过期后(默认 4 小时),后台异步刷新;
- 客户端在 ClientHello 中携带 status_request 扩展(现代浏览器默认开启)时,Nginx 需提供已缓存的 stapling 响应。
关键点:Nginx 不会在每次 TLS 握手时实时查询 OCSP,但若缓存为空或过期,且当前无可用响应,部分旧版本或特定编译配置下可能阻塞握手等待(尤其未设超时或 resolver 不可靠时)。
超时根源常出在这几个环节
真正导致“加载缓慢”的不是浏览器端检查本身,而是 Nginx 获取/更新 OCSP 响应时卡住:
-
DNS 解析失败或缓慢:OCSP 响应器域名(如
ocsp.int-x3.letsencrypt.org)需通过 Nginx 的resolver指令解析。若未配 resolver 或所用 DNS 不稳定(如系统默认 127.0.0.1:53 无响应),Nginx 会卡在 DNS 查询阶段,默认超时长达 30 秒; - OCSP 响应器不可达或响应慢:CA 的 OCSP 服务偶有延迟或区域性中断(如 Let’s Encrypt 的 ocsp.int-x3 在某些地区连接超时);
- 未设置合理的超时参数:Nginx 默认不设 OCSP 连接/读取超时,依赖系统级 socket 超时(可能达数分钟),极易引发 TLS 握手阻塞;
- ssl_stapling_verify 开启但验证失败:若开启该指令,Nginx 会校验 OCSP 响应签名和有效期,若 CA 根证书缺失或时间不同步,会导致 stapling 失效并反复重试。
实用优化配置方案
以下为生产环境推荐配置,兼顾安全性与响应稳定性(以主流 OpenSSL + Nginx 1.19+ 为例):
- 显式声明可靠 DNS:
resolver 8.8.8.8 1.1.1.1 valid=300s;(避免使用 localhost DNS) - 启用 stapling 并严格设超时:
ssl_stapling on;<br> ssl_stapling_verify on;<br> ssl_trusted_certificate /path/to/full_chain.pem; # 必须含根+中间证书
- 添加 OCSP 连接控制(Nginx 1.19+ 支持):
ssl_stapling_responder_timeout 5s;<br> ssl_stapling_responder_connect_timeout 3s;<br> ssl_stapling_responder_read_timeout 5s;
- 确保系统时间准确:
启用systemd-timesyncd或chrony,误差超过 5 分钟将导致 OCSP 响应被拒。
如何验证是否生效且无阻塞
不用等用户投诉,可主动检测:
- 查看 Nginx 错误日志关键词:
ocsp responder timed out、no suitable OCSP responder、stapling failed - 命令行快速测试 stapling 状态:
openssl s_client -connect example.com:443 -status -servername example.com 2>/dev/null | grep -i "OCSP response"
正常应返回OCSP Response Status: successful (0x0)及有效时间; - 用 curl 模拟浏览器行为:
curl -vI https://example.com 2>&1 | grep -i "ocsp"(部分版本支持显示 stapling 使用情况); - 临时关闭 stapling 测试对比:
改ssl_stapling off后压测首字节时间(TTFB),若明显改善,基本可定位为此问题。


















