Nginx 中 OCSP Stapling 与 HSTS 不直接冲突,但二者均需严格满足各自前提条件并配置在 443 server 块内:OCSP 要求证书含 OCSP URI、版本达标、时间精准、四指令齐备且 resolver 可达;HSTS 必须在 HTTPS 响应中通过 add_header + always 发送,并配合 80 端口 301 跳转。

Nginx 中 OCSP Stapling 和 HSTS 头本身不直接冲突,但它们的生效依赖不同机制、不同配置层级和严格的前提条件。所谓“联合配置时的顺序与逻辑冲突”,实际多是因配置位置错误、条件缺失或响应头未在 HTTPS 响应中发出导致的“看似失效”。排查重点不在“谁先谁后”,而在“是否都落在正确的上下文里且各自前提完备”。
以下分三类关键排查方向说明:
OCSP Stapling 是否真正启用
这个功能极易静默失败(无日志、无报错),必须逐项验证:
证书含有效 OCSP URI:用命令检查
openssl x509 -in /path/to/cert.pem -text -noout | grep -A1 "OCSP"
输出需明确出现类似OCSP - URI:http://ocsp.int-x3.letsencrypt.orgNginx 和 OpenSSL 版本达标:
nginx -v≥ 1.3.7(建议 ≥ 1.11.0)openssl version≥ 1.0.1(推荐 1.1.1+)时间偏差 ≤±5 分钟:
date与权威时间比对,误差超限会导致 OCSP 响应被直接拒绝配置全部放在 443 端口的 server 块内(不能放 http 块或 location 块),且四条指令同时存在:
ssl_stapling on;ssl_stapling_verify on;ssl_trusted_certificate /path/to/fullchain.pem;(仅含中间+根证书,不含站点证书)resolver 8.8.8.8 1.1.1.1 valid=300s;(必须显式指定,不读/etc/resolv.conf)DNS 可解析 OCSP 地址:手动测试
dig ocsp.int-x3.letsencrypt.org @8.8.8.8,确保能返回 A 记录
HSTS 头是否真正下发
HSTS 只在 HTTPS 响应中生效,HTTP 响应里加了也无效:
确保
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
放在 443 server 块内,且不能被 location 块中的add_header覆盖(Nginx 的add_header不继承,子块需重写)-
HTTP 端口(80)必须做 301 强制跳转:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }否则用户首次访问
http://时收不到 HSTS 头,后续也无法触发强制升级 always参数必须加上:否则 304、错误页等非 2xx 响应不带该头,影响策略持久性
二者共存时的典型误判场景
浏览器开发者工具看到 HSTS 生效,但 SSL Labs 测试显示 OCSP Stapling “Not Enabled”:
说明 OCSP 条件未满足(最常见是ssl_trusted_certificate指向了fullchain.pem但混入了站点证书,或 resolver 不通 OCSP 域名)curl 查看响应头有 HSTS,但
openssl s_client -connect example.com:443 -status显示OCSP response: no response sent:
表明 stapling 未触发,此时应检查 Nginx error log(开启error_log /var/log/nginx/error.log debug;可捕获 stapling 相关尝试日志)启用
preload后提交 HSTS Preload List 失败,提示“OCSP stapling not enabled”:
预加载审核系统会主动探测 OCSP 状态,不是只看 header,必须真实启用 stapling 才能通过
不复杂但容易忽略


















