什么是HSTS和HSTS预加载列表?
HSTS(HTTP 严格传输安全)协议是一种强制通过安全的 HTTPS 通道进行网络连接的策略/机制。换句话说:如果没有有效的SSL证书,此类网站将无法在您的浏览器中加载。浏览器甚至不会显示忽略SSL警告的选项。
HSTS是什么?
HSTS(HTTP Strict Transport Security)是一种通过 Strict-Transport-Security 响应头强制浏览器只能使用 HTTPS 访问网站的安全机制。开启 HSTS 后,浏览器会自动阻止 HTTP 降级访问,并防止 SSL 剥离与中间人攻击。
HSTS 主要通过三个核心参数进行控制:
-
max-age:指定客户端强制使用 HTTPS 的有效时间(秒); -
includeSubDomains:强制覆盖主域名下的所有层级子域名; -
preload:申请将域名写入浏览器内置的预加载列表中。
在配置 HSTS 之前,必须确保服务器已安装受信任的 SSL 证书并开启 HTTPS 访问。具体部署流程可参考 怎么安装SSL证书? 以避免因证书非法导致客户端被硬性阻断。

HSTS 和 HTTPS 有什么区别?
很多运维人员容易混淆 HSTS 与 HTTPS 的定位,实际上两者处于网络安全架构的不同层级:
| 比较维度 | HTTPS(HTTP over TLS) | HSTS(HTTP 严格传输安全) |
|---|---|---|
| 核心作用 | 建立服务端与客户端之间的加密通信管道。 | 强制客户端仅通过 HTTPS与服务端建立连接。 |
| 实现基础 | 依赖什么是SSL证书?及公钥私钥对。 | 依赖 Web 服务器返回的 HTTP 响应标头及浏览器本地策略。 |
| 解决的问题 | 数据明文传输容易被窃听、篡改的问题。 | 解决首次访问或重定向过程中被 HTTP 降级攻击的问题。 |
| 配置位置 | Web 服务器端口(如 443 端口)及 TLS 协议配置。 | Web 服务器响应头(Strict-Transport-Security)。 |
简单来说,HTTPS 是加密通信的“基石”,而 HSTS 是防止用户误入明文 HTTP 协议的“强制安全阀”。

HSTS 的工作原理
在未配置 HSTS 的情况下,即便网站设置了 301 重定向,用户在地址栏输入 example.com 时,首次请求依然会通过明文 HTTP(80 端口)发出。攻击者可以拦截这一瞬间的请求并修改重定向目标(即 SSL 剥离攻击),使浏览器停留在未加密状态。
当服务器在 HTTPS 响应中注入 HSTS 响应头后,浏览器会将该域名写入本地缓存。在策略有效期内,只要用户尝试访问该域名的 HTTP 链接,浏览器就会在客户端内部直接发起内部重定向(307 Internal Redirect),强制将请求升级为 HTTPS,避免首次访问阶段出现 HTTP 明文传输窗口。
Nginx 与 Apache 配置 HSTS 方法
1. Nginx 配置示例
在 443 端口的 server 块中添加 add_header 指令:
Nginx
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# 启用 HSTS (1年期 + 包含所有子域名)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# SSL 证书与加密套件配置...
}
2. Apache 配置示例
在 VirtualHost 配置中引入 Header 指令:
Apache
<VirtualHost *:443>
ServerName example.com
# 启用 HSTS
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>
注意:根据 RFC 6797 规范,客户端会忽略通过明文 HTTP(80端口)返回的 HSTS 标头。因此 80 端口只需配置普通的 301 重定向(网站如何从HTTP更改为HTTPS?),不要在 HTTP 块中设置 HSTS 头。
如何检查 HSTS 配置是否生效?
部署完成后,可以通过以下几种方式验证响应头是否正确返回:
1. 使用 curl 命令行检查
在终端运行以下命令调取响应头(注意需使用 https://):
Bash
curl -I https://example.com
若返回信息中包含类似如下字段,说明设置已生效:
HTTP
HTTP/2 200
strict-transport-security: max-age=31536000; includeSubDomains
2. 通过 Chrome 开发者工具或内部面板查看
- 开发者工具:按
F12打开 Network 标签页,刷新页面并点击主文档请求,在 Response Headers 中查看Strict-Transport-Security。 - HSTS 内部缓存面板:在 Chrome 地址栏输入
chrome://net-internals/#hsts,在 Query HSTS/PKP domain 输入框中查询自己的域名,可校验浏览器本地是否已写入该 HSTS 策略。
什么是 HSTS Preload 预加载列表?
为了解决用户在“全新设备/首次访问”时尚未接收到 HSTS 标头的安全空窗期,主流浏览器厂商共同维护了一个硬编码的 **HSTS Preload List(预加载列表)**。
只要域名提交并入选该列表,Chrome、Firefox、Safari、Edge 等浏览器在出厂时就已经硬编码了该域名“只能使用 HTTPS”。
申请加入 Preload 列表的条件
- 主域名及所有解析的子域名必须部署受信任的 SSL 证书。涉及多子域名部署可参考 SSL证书类型怎么分?。
- 80 端口必须重定向到 443 端口。
- 标头必须满足:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload。 - 提交前应确认不存在无法支持 HTTPS 的遗留子域名(如内部测试系统或老旧 API),否则可能造成长期访问失败。满足条件后可前往
hstspreload.org提交。
运维避坑与风险提示
引入 HSTS 与 HSTS Preload 意味着放弃了所有明文 HTTP 的退路。在实际工程落地中,务必注意以下两点:
- 子域名死锁风险:配置
includeSubDomains后,主域名下的所有层级子域名(如test.dev.example.com)都会被强制开启 HTTPS。如果某个内部子域名没有配置合法证书,用户将彻底无法访问,且无法在浏览器中点击“高级 $\rightarrow$ 继续访问”忽略警告。 - Preload 撤销极其困难:加入 Preload 列表后,若要撤销,需要提交移除申请并等待各大浏览器厂商更新版本发布,整个生效周期可能长达数月。
常见问题
开启 HSTS 后,如果 SSL 证书过期了,用户还能跳过警告继续访问吗?
不能。当网站开启了 HSTS 且客户端已缓存该策略时,一旦 TLS 握手过程中发生证书过期、域名不匹配或中级证书链丢失等错误,浏览器会直接展示硬性阻断页面,彻底禁用“跳过警告继续访问”的选项。关于证书失效的应急处理可参阅 如何修复SSL证书错误?。
如果在 Nginx 中删除了 HSTS 配置,用户的浏览器会立刻恢复 HTTP 访问吗?
不会。浏览器在首次读取 HSTS 标头时,已经在本地缓存了该策略,缓存有效期由配置的 max-age 决定。若要紧急清除客户端的 HSTS 策略,需要将标头改为 Strict-Transport-Security: max-age=0 并让用户重新访问一次网站,以覆盖本地缓存。
免费 SSL 证书可以用来开启 HSTS Preload 吗?
可以。只要证书是由受信任 CA 签发的有效证书(例如通过 免费SSL证书 申请的证书),且响应头配置满足 max-age=31536000; includeSubDomains; preload 的条件,均可成功提交至 hstspreload.org。



京公网安备11010502031690号
网站经营企业工商营业执照
















