7.5.4 HSTS、OCSP与安全头配置

在 HTTPS 部署完成后,需要通过 HSTS、OCSP 与安全响应头进一步收紧浏览器与客户端的安全行为。本节从机制原理到 Nginx 配置与验证流程,给出可落地的加固方案与注意事项,并提供排错与练习。

HSTS 强制 HTTPS#

HSTS(HTTP Strict Transport Security)通过响应头告知浏览器在有效期内仅使用 HTTPS 访问,防止 SSL Strip 等降级攻击。

原理草图

flowchart TD
A[浏览器] -->|首次 HTTPS| B[Nginx]
B -->|返回 HSTS 头| A
A -->|后续仅 HTTPS| B
A -.->|阻止 HTTP 降级| C[中间人]

推荐策略
- 初始部署使用较短 max-age,观察无误后逐步延长。
- 确认全站 HTTPS 可用,避免 HSTS 导致无法回退访问。
- 若需要加入浏览器预加载列表,必须满足子域名全 HTTPS。

Nginx 配置示例(完整片段)

# /etc/nginx/conf.d/ssl.conf
server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/nginx/ssl/example.com.fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

命令解释与生效检查

# 语法检查与平滑重载
nginx -t
nginx -s reload

# 验证 HSTS 响应头是否生效
curl -I https://example.com | grep -i strict-transport-security
  • 预期输出包含 Strict-Transport-Security: max-age=...

排错要点
- HSTS 未生效:确认请求走 HTTPS(非 80 端口),并检查是否被上游代理覆盖。
- includeSubDomains 开启后子域名异常:需要保证所有子域名均有 HTTPS 服务。

OCSP 与证书吊销状态#

OCSP(Online Certificate Status Protocol)用于实时查询证书吊销状态,减少证书被吊销后仍被信任的风险。

原理草图(OCSP Stapling)

sequenceDiagram
participant N as Nginx
participant C as CA/OCSP
participant B as Browser
N->>C: 定期获取OCSP响应
C-->>N: OCSP响应
B->>N: TLS握手
N-->>B: 携带OCSP响应(Stapling)

Nginx 配置示例

# /etc/nginx/conf.d/ssl.conf
ssl_stapling on;
ssl_stapling_verify on;

# DNS 解析器用于访问 OCSP
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;

# 推荐使用完整证书链
ssl_certificate     /etc/nginx/ssl/example.com.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;

命令解释与验证

# 确认配置生效
nginx -t && nginx -s reload

# 查看 OCSP 状态
openssl s_client -connect example.com:443 -servername example.com -status </dev/null
  • 预期输出包含 OCSP Response Status: successful

常见错误与处理
- OCSP stapling 失败:检查 fullchain 是否完整、DNS 是否可达、出站 53/80/443 是否被防火墙阻断。
- 证书链不完整:从 CA 重新下载 fullchain.pem。

安全响应头配置#

通过安全响应头减少 XSS、点击劫持、MIME 嗅探等风险。

推荐响应头
- X-Frame-Options:防止被 iframe 嵌套
- X-Content-Type-Options:禁止 MIME 嗅探
- X-XSS-Protection:旧版浏览器 XSS 保护(现代浏览器可省略)
- Referrer-Policy:控制 Referer 泄露
- Content-Security-Policy:限制资源加载来源

Nginx 配置示例(完整片段)

# /etc/nginx/conf.d/security-headers.conf
server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/nginx/ssl/example.com.fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' 'unsafe-inline'" always;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

验证命令

# 查看安全头是否存在
curl -I https://example.com | egrep -i "x-frame|x-content|x-xss|referrer|content-security"

# 浏览器验证 CSP 阻断
# 打开浏览器控制台查看被阻断资源的报错信息

排错要点
- CSP 阻断资源:控制台查看被阻断域名并逐步放行(最小许可原则)。
- 资源加载异常:先在测试环境启用 CSP,再灰度到生产。

配置注意事项与上线流程#

  1. 分阶段启用:HSTS 与 CSP 建议从测试环境验证再灰度发布。
  2. CSP 与业务兼容:如有第三方资源需显式放行,否则会导致页面异常。
  3. 证书链完整性:OCSP Stapling 依赖完整链,需使用 fullchain。
  4. 回滚策略:HSTS 生效期间无法通过浏览器回退至 HTTP,需提前评估。

常见问题排查#

  • HSTS 未生效:确认 HTTPS 响应头是否被反向代理覆盖;检查 add_header 是否在对应 server 块。
  • OCSP stapling 失败:检查 resolver、证书链、外网连通性(53/80/443)。
  • CSP 阻断资源:浏览器控制台查看 CSP 报错并调整策略。

练习与自测#

  1. 练习 1:分阶段启用 HSTS
    - 将 max-age 设为 300,验证后提高到 86400
    - 用 curl -I 检查响应头变化。

  2. 练习 2:验证 OCSP
    - 临时关闭 ssl_stapling 并重载,使用 openssl s_client 对比输出差异。

  3. 练习 3:CSP 最小化放行
    - 先设置 default-src 'self',观察报错并仅放行必需第三方域。

通过 HSTS、OCSP stapling 与安全头的组合配置,可以显著提升站点安全性与浏览器端的信任策略强度,是 HTTPS 加固的核心环节。