HTTP严格传输安全(HSTS)预加载列表是浏览器厂商维护的一个强制HTTPS访问的域名白名单。把你的域名提交到这个列表后,所有支持该列表的浏览器在首次访问你的网站时,就会直接通过HTTPS连接,而不会先尝试HTTP。这意味着即使用户手动输入http://开头的地址,浏览器也会自动跳转到https://,彻底杜绝了降级攻击和SSL剥离攻击的风险。提交的核心入口是Chromium项目维护的官方HSTS预加载列表仓库,你需要在GitHub上发起Pull Request,按照规定的JSON格式填写你的域名信息,经过审核通过后,大约会在几周内被纳入浏览器更新版本。
什么是HSTS预加载列表以及为什么要提交
HSTS(HTTP Strict Transport Security)本身是一个HTTP响应头,服务器返回这个头告诉浏览器"以后只用HTTPS访问我"。但问题在于,第一次访问时浏览器并不知道这个头的存在,攻击者可以在第一次连接时进行中间人攻击。预加载列表就是为了解决这个"第一次"的问题。你的域名被硬编码到浏览器源码里,从根本上消除了首次访问的安全盲区。
提交预加载列表的好处非常明确:第一,完全消除HTTP降级攻击;第二,用户体验更好,不会出现混合内容警告;第三,在安全评估和合规审计中是加分项;第四,对SEO有间接正面影响,因为搜索引擎优先收录和排名HTTPS站点。对于金融、电商、医疗、政务类网站来说,这几乎是必须做的安全加固措施。
提交前的必要条件和准备工作
在正式提交之前,你必须确保网站满足以下所有条件,缺一不可:
1. 网站必须已经部署有效的SSL/TLS证书,且证书链完整、没有过期风险。建议使用至少2048位RSA或ECDSA证书,有效期覆盖未来较长时间。
2. HTTPS响应头必须正确配置。服务器需要返回Strict-Transport-Security头,且max-age值至少为31536000(一年),建议设置为63072000(两年)或更高。同时必须包含includeSubDomains指令,确保所有子域名也强制HTTPS。
3. 必须支持HTTP到HTTPS的自动重定向。如果用户访问http://版本,服务器要返回301或302状态码跳转到https://。注意,预加载列表要求的是最终通过HTTPS提供服务,重定向本身是允许的,但不能在HTTPS页面上加载HTTP资源。
4. 所有子域名都必须支持HTTPS。如果你有blog.example.com、api.example.com这类子域名,它们都要有有效证书并支持HTTPS访问。
5. 网站不能使用自签名证书或无效证书。浏览器不会信任自签名证书,预加载列表审核也会直接拒绝。
6. 确保网站在80端口的HTTP访问能正常重定向到443端口的HTTPS。你可以用在线工具检测,比如SSL Labs的测试或者curl命令验证。
HSTS响应头的正确配置方式
在提交之前,你需要在Web服务器上正确配置HSTS头。以下是不同服务器的配置示例:
Nginx配置:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 其他配置...
}
Apache配置:
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</VirtualHost>
注意,preload指令只是一个标记,表示你打算提交预加载列表。真正生效要等审核通过后浏览器更新才会生效。在审核通过之前,这个指令不会产生额外效果,但加上它是提交的必要步骤。
具体提交流程详解
提交HSTS预加载列表的官方渠道是Chromium项目的hstspreload.org网站对应的GitHub仓库。具体步骤如下:
第一步,访问 https://hstspreload.org/ 这个官方页面,页面底部有链接指向GitHub仓库的提交指南。你也可以直接访问 https://github.com/chromium/hsts 找到源代码仓库。
第二步,Fork或克隆这个仓库到你的本地环境。如果你不熟悉Git操作,可以直接在GitHub网页上编辑文件。
第三步,找到chromium/chromium/net/http/transport_security_state_static.json 这个文件。这个JSON文件里维护着所有预加载域名的列表,按字母顺序排列。
第四步,在这个JSON数组中添加你的域名。格式是一个字符串,放在数组元素里。例如你要提交example.com,就在合适的字母位置添加 "example.com"。注意只需要写主域名,不需要写https://前缀,也不需要写www前缀(除非你要单独提交www子域名)。
第五步,提交Pull Request。在GitHub上创建一个新的分支,修改JSON文件后发起PR。PR的标题和描述要简洁说明你要添加哪个域名到HSTS预加载列表。
第六步,等待审核。维护者会检查你的域名是否满足所有条件,包括证书有效性、HSTS头配置、重定向是否正常等。审核周期通常是几天到几周不等。
第七步,审核通过后,你的域名会被合并到主分支。下一个浏览器版本更新时(通常是Chrome、Edge、Firefox等主流浏览器的定期更新),预加载列表就会包含你的域名。
提交时的常见错误和避坑指南
很多人在提交过程中会犯一些低级错误导致被拒绝。以下是最常见的问题:
错误一:JSON格式不对。多一个逗号、少一个引号、位置放错字母顺序,都会导致PR被拒绝。一定要仔细检查JSON语法是否正确,可以用JSON验证工具校验。
错误二:只提交了主域名但子域名不支持HTTPS。审核时维护者会检查你的子域名,如果发现某个子域名返回证书错误或无法访问HTTPS,会直接拒绝你的申请。建议提前用在线工具扫描所有子域名。
错误三:max-age值设置太低。虽然官方要求至少一年,但建议设置两年以上。设置太短会让审核人员认为你对长期维护HTTPS没有信心。
错误四:证书即将过期。如果你的证书在几个月内就要过期,审核可能会被推迟或拒绝。建议在提交前确保证书有效期至少还有一年以上。
错误五:网站存在混合内容问题。HTTPS页面上如果加载了HTTP的图片、脚本、样式表,这就是混合内容。虽然浏览器会拦截,但预加载列表审核时也会检测到这类问题。务必确保全站所有资源都通过HTTPS加载。
错误六:PR描述不清楚。有些人提交PR时只写"add domain",没有说明域名和网站类型。建议写清楚域名、网站用途、已完成的配置检查等信息,方便审核者快速通过。
提交后如何验证是否生效
提交通过并不意味着立即生效,你需要等待浏览器更新。验证方法有以下几种:
方法一:访问 https://hstspreload.org/ 输入你的域名查询。如果显示在列表中,说明已经被纳入预加载。
方法二:在浏览器地址栏输入chrome://net-internals/#hsts,在Domain查询框中输入你的域名,如果显示状态为"FOUND"或"MODE_FORCE_HTTPS",说明预加载已生效。
方法三:用curl命令检测响应头:
curl -I https://example.com
如果返回的响应头中包含Strict-Transport-Security且带有preload指令,说明服务器配置正确。但要注意,服务器返回preload指令和浏览器实际预加载是两回事,只有浏览器更新后才真正生效。
方法四:使用在线HSTS检测工具,输入域名后会告诉你是否在预加载列表中以及配置状态。
关于移除预加载列表的注意事项
如果以后你需要从预加载列表中移除域名(比如网站要关闭HTTPS或更换域名),你需要再次发起PR删除对应条目。但要特别注意:一旦被加入预加载列表,在max-age有效期内,浏览器会持续强制HTTPS。如果你在有效期内关闭了HTTPS,用户将完全无法访问你的网站,因为浏览器会拒绝任何HTTP连接。所以移除操作一定要谨慎,确保你有替代方案或者已经过了有效期。
官方建议,如果你要移除,最好等到当前max-age过期后再操作,或者至少提前一个max-age周期开始准备迁移。移除的PR同样需要在GitHub仓库中提交,审核流程和添加类似。
HSTS预加载与其他安全措施的协同
HSTS预加载不是孤立的安全措施,它应该和其他安全策略配合使用。建议同时部署以下措施:
内容安全策略(CSP):防止XSS攻击,限制页面可以加载的资源来源。
安全Cookie设置:设置Secure和HttpOnly属性,确保Cookie只通过HTTPS传输且JavaScript无法访问。
证书透明度监控:使用证书透明度日志监控你的域名是否被恶意签发证书。
定期安全扫描:使用自动化工具定期检测网站的安全配置,包括SSL/TLS版本、密码套件、HSTS头等。
这些措施组合在一起,才能构建一个真正健壮的网站安全体系。HSTS预加载是其中非常关键的一环,但绝不是唯一的一环。
总结和行动建议
HSTS预加载列表提交是一个技术门槛不高但细节要求严格的操作。核心就是三件事:确保全站HTTPS配置正确无误、在GitHub仓库按规范提交PR、耐心等待审核和浏览器更新。对于任何重视网站安全的运营者来说,这是性价比极高的安全加固手段。现在就去检查你的网站HSTS配置,如果还没提交预加载列表,赶紧准备材料发起申请。早一天提交,早一天获得保护。
