chrome通过硬编码在源码中的hsts预加载列表强制https重定向,拒绝http回退与证书错误绕过;列表由google维护,同步至edge、firefox、safari;运行时直接查表匹配并拦截不安全连接。

Chrome浏览器在启动HTTPS安全连接时,会依据HSTS预加载列表(HSTS Preload List)强制执行HTTP到HTTPS的自动重定向,并拒绝接受不安全的HTTP回退或证书错误绕过。该列表由Google维护,硬编码于Chrome源码中,且被其他主流浏览器(如Edge、Firefox、Safari)同步采用。以下是Chrome处理HSTS预加载列表的具体机制与操作要点:
一、HSTS预加载列表的获取与编译集成
Chrome不通过网络动态拉取预加载列表,而是将列表以C++头文件形式静态嵌入二进制代码中。每次Chromium源码更新时,开发者需运行脚本从hstspreload.org官方仓库同步最新列表,并生成net/http/transport_security_state_static.json及对应的C++数组。
1、访问 https://chromium.googlesource.com/chromium/src/+/main/net/http/transport_security_state_static.json 查看当前Chromium主干中嵌入的预加载状态数据。
2、确认include_subdomains和mode字段值:若为force-https且include_subdomains为true,则该域名及其所有子域均禁止使用HTTP且不可忽略证书错误。
3、检查created字段时间戳,验证该条目是否已在最近6个Chromium稳定版中生效(通常需经历约3个月审核与发布周期)。
二、运行时HSTS预加载匹配逻辑
当Chrome发起DNS解析前,会先对请求域名进行预加载列表查表。若命中,浏览器跳过HTTP明文尝试,直接构造HTTPS请求,并在TLS握手阶段强制校验证书链有效性,任何证书异常(如自签名、过期、域名不匹配)都将触发NET::ERR_CERT_AUTHORITY_INVALID等硬性拦截,且不提供“高级”→“继续前往”按钮。
1、输入chrome://net-internals/#hsts,在“Query domain”框中输入目标域名(如example.com),点击Query。
2、观察返回结果中的static_upgrade_mode字段:若显示FORCE_HTTPS,表示该域名处于预加载列表中且已启用强制升级。
3、注意dynamic_upgrade_mode字段为空,说明该行为不由服务器响应头(Strict-Transport-Security头)动态触发,而是完全依赖静态列表。
三、域名提交至HSTS预加载列表的验证流程
向hstspreload.org提交域名前,服务器必须持续返回有效的HSTS响应头至少30天,且满足严格条件。Chrome仅接受经该平台审核通过并合并进Chromium源码的域名,本地无法手动添加或删除。
1、确保Web服务器对根域名及所有必需子域(如www、api)均返回包含max-age=31536000、includeSubDomains、preload的Strict-Transport-Security响应头。
2、通过curl -I https://example.com验证响应头中存在strict-transport-security: max-age=31536000; includeSubDomains; preload,且无语法错误或缺失分号。
3、访问 https://www.php.cn/link/b9fcbc854cc45e5802618e283d3fe525/?domain=example.com 提交域名,系统将自动检测HTTP可访问性、HTTPS重定向完整性、证书有效性及响应头合规性。
四、调试与排除预加载相关异常
当预期启用HSTS预加载但实际未生效时,可能源于域名未被收录、缓存残留或测试环境误判。Chrome提供专用调试页面辅助定位问题根源,无需修改源码或重新编译。
1、在地址栏输入chrome://net-internals/#hsts,使用“Delete domain”功能清除特定域名的动态HSTS记录,避免与预加载状态混淆。
2、点击“Clear cache and hard reload”刷新页面,确保不使用旧缓存的HTTP响应或中间代理注入的非标准头。
3、在开发者工具(F12)的Network标签页中,筛选doc类型请求,检查Headers面板下Response Headers是否包含正确HSTS头——若存在,说明尚未进入预加载阶段,仍属动态策略范畴。
五、Chrome版本与预加载列表同步机制
预加载列表随Chromium主干更新而变更,不同Chrome稳定版所含列表版本不同。用户无法独立更新该列表,必须升级整个浏览器二进制文件才能获得最新收录状态。
1、在Chrome地址栏输入chrome://version/,查看“Command Line”行末尾是否包含--version参数,确认当前构建版本号(如128.0.6613.114)。
2、访问 https://chromium.googlesource.com/chromium/src/+/refs/tags/128.0.6613.114/net/http/transport_security_state_static.json,比对对应版本的预加载列表快照。
3、若发现某域名在最新Chromium主干中已加入但当前Chrome未生效,说明该版本尚未推送至稳定通道,需等待后续更新发布。










