ocsp stapling 静默失效会导致移动端 https 握手卡顿,需同时满足五项前提(证书含 ocsp uri、nginx≥1.3.7、openssl≥1.0.1、时间偏差≤±5分钟、证书链完整)并配置四条指令(ssl_stapling on、ssl_stapling_verify on、ssl_trusted_certificate、resolver),缺一不可。

移动端 App 内嵌 WebView 访问 Nginx HTTPS 站点时出现 SSL 验证卡顿,开启 OCSP Stapling 后反而更慢,说明配置未真正生效或触发了阻塞行为——不是“开了就快”,而是“配错就卡”。核心问题在于:Nginx 在无法获取有效 OCSP 响应时,可能延迟握手甚至静默降级,而移动端对超时更敏感。
确认 OCSP Stapling 是否真实启用
它不报错、不警告,但缺一不可就会静默关闭。需逐项验证:
- 运行 openssl x509 -in /path/to/your.crt -text -noout | grep -A1 "OCSP",确认输出含有效 URI(如 OCSP - URI: http://ocsp.int-x3.letsencrypt.org)
- 检查 Nginx 版本 ≥ 1.3.7(推荐 ≥ 1.11.0),OpenSSL ≥ 1.0.1(建议 1.1.1+)
- 用 chronyc tracking 或 ntpdate -q pool.ntp.org 确保系统时间偏差 ≤ ±5 分钟
- 确认 ssl_certificate 指向的是 fullchain.pem(域名证书 + 中间证书),而非仅 cert.pem
检查四条指令是否共存且位置正确
必须全部写在同一个 server { listen 443 ssl; } 块内,缺一则 stapling 不工作:
- ssl_stapling on;
- ssl_stapling_verify on;
- ssl_trusted_certificate 指向仅含中间证书 + 根证书的 PEM 文件(顺序:中间在前、根在后),不能是 fullchain.pem,也不能混入域名证书
- resolver 显式声明至少两个 DNS(如 1.1.1.1 8.8.8.8),并带 valid=300s 和 resolver_timeout 5s
验证 OCSP 响应是否可获取且可信
这是卡顿最常见原因:Nginx 启动/重载时首次预取失败,或缓存过期后异步刷新超时,导致客户端发起 status_request 时无响应可发。
- 手动测试连通性:curl -v -I http://ocsp.int-x3.letsencrypt.org(注意是 HTTP,非 HTTPS;若被拦截,需换 DNS 或代理)
- 本地模拟校验:openssl ocsp -issuer intermediate.crt -cert your-domain.crt -url http://ocsp.int-x3.letsencrypt.org -CAfile /path/to/trusted-ocsp-ca.pem -text,成功标志是 Response verify OK 或 response is good
- 查看 Nginx error.log,搜索 stapling ignored、ocsp responder timeout 或 no response from OCSP server
观察实际握手行为与协议状态
真卡在哪一步,得看真实连接:
- 手机连电脑 Chrome DevTools → Network → 刷新页面 → 查 Protocol 列是否为 h2;若仍是 http/1.1,说明 HTTP/2 未启用或 ALPN 协商失败
- 用 curl -v --http2 https://your-domain.com,看是否返回 HTTP/2 200;若 fallback 到 HTTP/1.1,检查是否用了自签名证书或 ALPN 不支持
- 抓包(如 iOS USB 直连 Sniffmaster 或 Android tcpdump)观察 TLS 握手耗时:若 ClientHello → ServerHello 耗时 >300ms,重点查 OCSP Stapling 和会话复用是否生效











