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,再灰度到生产。
配置注意事项与上线流程#
- 分阶段启用:HSTS 与 CSP 建议从测试环境验证再灰度发布。
- CSP 与业务兼容:如有第三方资源需显式放行,否则会导致页面异常。
- 证书链完整性:OCSP Stapling 依赖完整链,需使用 fullchain。
- 回滚策略:HSTS 生效期间无法通过浏览器回退至 HTTP,需提前评估。
常见问题排查#
- HSTS 未生效:确认 HTTPS 响应头是否被反向代理覆盖;检查
add_header是否在对应server块。 - OCSP stapling 失败:检查
resolver、证书链、外网连通性(53/80/443)。 - CSP 阻断资源:浏览器控制台查看 CSP 报错并调整策略。
练习与自测#
-
练习 1:分阶段启用 HSTS
- 将max-age设为300,验证后提高到86400。
- 用curl -I检查响应头变化。 -
练习 2:验证 OCSP
- 临时关闭ssl_stapling并重载,使用openssl s_client对比输出差异。 -
练习 3:CSP 最小化放行
- 先设置default-src 'self',观察报错并仅放行必需第三方域。
通过 HSTS、OCSP stapling 与安全头的组合配置,可以显著提升站点安全性与浏览器端的信任策略强度,是 HTTPS 加固的核心环节。