什么是HSTS preload列表
HSTS preload列表是一个硬编码在浏览器中的域名清单,由Google维护,内置在Chrome、Firefox、Safari等主流浏览器的源代码里。只要域名在这个列表里,浏览器会无条件强制HTTPS,即使用户手动输入http://或者点击HTTP链接,也会被自动升级为HTTPS。
这比普通的HSTS响应头更底层——它不需要第一次访问来获取响应头,从用户安装浏览器的那一刻起,你的域名就已经被"记死"为HTTPS-only。
Chrome更新preload列表的周期
Chrome的正式版发布周期是每4周一个大版本(早期是6周,从M94开始改为4周)。每次构建新版本时,会从hstspreload.org拉取最新的已批准域名列表,然后编译进Chrome的二进制文件中。
所以,HSTS preload列表的更新周期 = Chrome的版本发布周期 ≈ 4周。
但注意,这里有一个关键的代码冻结(Code Freeze)时间点。每个Chrome版本在进入"稳定版"分支之前,会有一个截止日期。在这个截止日期之前通过审核的域名,才会被包含在这个版本的Chrome中。错过这个窗口,就要等下一个4周。
提交新域名后到底要等多久
这是大家最关心的问题。完整的等待链条是这样的:
- 在hstspreload.org提交域名,等待人工审核(通常1-2周)
- 审核通过后,域名进入"approved"状态,等待下一次Chrome构建窗口
- Chrome构建时把域名编入preload列表,发布新版本(4周周期)
- 用户更新Chrome到新版本(用户可能延迟数周才更新)
综合来看,从提交到最终在大部分用户浏览器中生效,通常需要6-12周。这看起来很长,但这是有意设计的——HSTS preload是强约束,一旦进入列表就很难撤销,审核和发布流程必须谨慎。
如何确认当前Chrome版本是否已包含我的域名
有两个方法可以验证:
方法一:chrome://net-internals/#hsts
在Chrome地址栏输入:
chrome://net-internals/#hsts
在"Query HSTS/PKP domain"输入框中填入你的域名,点击Query。如果返回了static_sts_domain信息,说明你的域名已经在当前Chrome版本的preload列表中了。
方法二:查看Chromium源代码
Chrome的preload列表文件是公开可查的,位于Chromium源码仓库:
net/http/transport_security_state_static.json
你可以直接搜索这个文件,查找你的域名,看看它出现在哪个Chrome版本中。
为什么提交后迟迟没有生效
有几个常见原因,逐一排查:
1. HSTS响应头配置不满足要求
hstspreload.org批准域名的前提是,你的服务器必须正确返回HSTS响应头,且同时满足:
max-age至少为31536000(1年)- 包含
includeSubDomains指令 - 包含
preload指令 - 所有子域名也必须支持HTTPS(因为includeSubDomains)
- 拥有有效、完整的HTTPS证书链
2. 错过了Chrome代码冻结窗口
即使hstspreload.org批准了你的域名,也需要等到下一次Chrome版本构建时才能进入preload列表。可以查看Chromium发布日程来确认当前版本的状态。
3. 用户还没更新Chrome
即使用户更新Chrome,也不是所有人都会立即更新。根据统计,Chrome用户中有10-20%会在新版本发布后数周才更新。
本地HSTS缓存会干扰验证
即使用户更新了Chrome,如果之前已经访问过你的域名,并且HSTS缓存还在生效期内,浏览器可能不会立即反映preload列表的变化。
正确的验证步骤是:
- 打开
chrome://net-internals/#hsts - 在"Delete domain security policies"中输入你的域名,点击Delete
- 关闭并重新打开Chrome
- 再次访问你的域名,然后用Query功能确认preload状态
加速生效的辅助方案:配置HSTS响应头
在等待preload列表生效的期间,你可以在自己的服务器上先配置HSTS响应头。这样:
- 新用户:依赖preload列表(等Chrome更新)
- 老用户:依赖HSTS响应头(立即生效)
两者配合,可以最大限度地覆盖用户。Nginx配置示例:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
注意always参数,它确保即使返回4xx/5xx错误码,HSTS头也会被发送。
Firefox和Safari的更新周期
Firefox的更新周期也是4周,和Chrome同步得比较好。Firefox同样使用从hstspreload.org获取的同一份列表,所以时间线大致相同。
Safari的更新周期和macOS/iOS的版本更新绑定,周期不固定(通常每年2-3次大版本)。但Safari同样内置了同一份preload列表,所以最终效果是一样的——只是Safari用户的生效时间可能更晚一些。
常见问题
Q:提交后能不能撤销?
A:可以,但撤销也需要等待Chrome更新。在hstspreload.org提交撤销申请后,需要等待下一次Chrome版本更新,域名才会从preload列表中移除。等待时间和添加时差不多,也是6-12周。所以提交前一定要确认自己的网站长期支持HTTPS。
Q:子域名需要单独提交吗?
A:不需要。includeSubDomains指令会自动覆盖所有子域名。这也是hstspreload.org要求必须配置includeSubDomains的原因。
Q:如何查看Chromium的preload列表文件?
A:访问Chromium源码仓库,搜索你的域名即可。这个文件有数万行,包含了所有已批准的域名。
相关文章
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论