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配置,如果还没提交预加载列表,赶紧准备材料发起申请。早一天提交,早一天获得保护。