HSTS 预加载 (HSTS Preload)
定义
HSTS 预加载是内置在浏览器中的一份域名列表,列表内的域名始终通过 HTTPS 访问,连首次访问、尚未收到 HSTS 头之前也受保护。
HSTS 预加载列表由 Chromium 项目维护,通过 hstspreload.org 提交;Chrome、Firefox、Safari 和 Edge 内置的列表都源自它。被预加载的域名及其全部子域名直接写进浏览器,即便是刚装好的浏览器也不会对它发出任何明文 HTTP 请求。整个顶级域也可以预加载,例如 .app 和 .dev,所以这些后缀的网站从上线第一天起就必须支持 HTTPS。
为什么重要
普通的 HSTS 依赖浏览器之前见过这个响应头,首次访问仍可能遭到 SSL 剥离。预加载补上了这个缺口,但承诺很重:只能提交可注册域名(example.com,而不是 www.example.com);要有有效证书,同一主机上把 HTTP 跳转到 HTTPS,并下发包含 includeSubDomains、preload 且 max-age 不少于一年(31536000 秒)的 HSTS 头。加入后,浏览器可能访问到的每个子域名,包括内网管理后台,都必须能走 HTTPS。移除是可以申请的,但要跟随浏览器版本发布才生效,旧版浏览器会一直保留这条记录。
例子
申请预加载的域名在 https://example.com 上应返回:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
提交前先用 HSTS 检测工具看看主域名实际返回的头,并把在用的子域名逐一列出来核对。
常见误区
- 响应头里写上 preload 就进列表了。 这个指令只表示同意,还需要提交、审核通过,再随浏览器版本发布。
- 预加载随时可以撤销。 移除要经过一个浏览器发布周期才能到达用户,不再更新的旧浏览器会永久保留,应视为不可逆。
- 只影响主站。
includeSubDomains覆盖所有子域名,域名下只支持 HTTP 的设备管理页面或内部工具会在浏览器中打不开。