久诚SSL

如何配置 HSTS(HTTP 严格传输安全),强制浏览器只使用 HTTPS 访问我的网站?

如何配置 HSTS(HTTP 严格传输安全),强制浏览器只使用 HTTPS 访问我的网站?

在成功部署 HTTPS 并优化了相关性能后,为了彻底杜绝用户在首次访问时可能遭遇的“SSL 剥离”或中间人攻击,我们需要部署一道终极安全防线——HSTS(HTTP Strict Transport Security,HTTP 严格传输安全)。HSTS 本质上是一把“记忆型安全锁”,它通过服务器响应头告知浏览器:在指定的有效期内,禁止使用不安全的 HTTP 协议访问该网站,必须自动将所有请求改写为 HTTPS。

配置前的三大硬性前提
HSTS 并非在任何环境下都能生效,配置前必须确认以下三点缺一不可:
站点已部署有效且受信的 SSL/TLS 证书(自签名或过期证书会导致浏览器拒绝加载 HSTS)。
Web 服务器(如 Nginx/Apache)已启用 HTTPS 虚拟主机,且 443 端口服务正常响应。
相关的 headers 模块(如 Nginx 的 headers 模块或 Apache 的 mod_headers)已加载并启用。

主流 Web 服务器的标准配置写法
HSTS 响应头只能且必须通过加密连接发送,绝不能出现在 HTTP(80端口)的配置中。

Nginx 配置:在 server { listen 443 ssl; ... } 块中添加:

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

Apache 配置:在 内添加:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

核心参数解析与进阶预加载(Preload)
max-age:指定浏览器记住该策略的秒数。推荐最终设置为 1 年(31536000秒)或 2 年(63072000秒)。
includeSubDomains:将此策略强制应用于所有现有和未来的子域名,防止攻击者针对非安全子域名进行攻击。
preload:如果加上此参数,意味着您同意将域名提交至浏览器的内置预加载列表(需前往 hstspreload.org 申请)。这能确保用户在首次访问您的网站时,浏览器就已经知道必须使用 HTTPS,彻底消除初始连接的攻击窗口。

⚠️ 极其重要的安全上线节奏
HSTS 是一把双刃剑,一旦在浏览器中缓存,服务器端是无法远程清除的。如果配置有误导致全站瘫痪,用户将无法访问。因此,切忌一上线就设置 1 年有效期,必须遵循以下灰度测试节奏:
初始测试:首次上线设置 max-age=300(仅 5 分钟),验证浏览器是否真能自动跳转 HTTPS,且所有子域名均正常。
逐步延长:确认无误后,逐步延长至 86400(1天) → 2592000(30天)。
全面部署:经过彻底测试后,再将 max-age 设置为推荐的最终值(1年或2年),并考虑加入 preload 指令。

故障排查与紧急回滚
如果因为误开 HSTS 导致业务受损,唯一的可靠回滚方式是将响应头修改为 max-age=0(这会让浏览器立即清除缓存),但请注意,这仅对尚未缓存旧策略的新用户生效。对于已经缓存了长 max-age 的用户,他们可能需要在浏览器中手动清理 HSTS 缓存(例如在 Chrome 中访问 chrome://net-internals/#hsts 删除对应域名)才能恢复访问。

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »