
curl 8.22.0 改变了 HSTS 解析器识别指令名的方式:已知名称现在必须完整匹配一个 token,而不能只匹配前缀。该版本于 2026 年 9 月 2 日发布,相关 curl 项目修复在 8 月下旬完成。
问题说明给出了两种具体影响:以 includeSubDomains 开头的相似名称可能被当作真实指令;以 max-age 开头的相似名称则可能干扰后续有效 max-age 指令的处理。修正后的解析器会把更长的相似名称视为未知指令,并继续按语法处理真正被识别的指令。
这对代理采集和验证系统很重要,因为 HSTS 决策发生在客户端。缓存策略可能在代理协商前就把 HTTP URL 升级成 HTTPS,从而改变目标协议、端口、CONNECT 行为、TLS 握手与连接池键,即使输入 URL 没有变化。
curl 8.22 改了什么
curl 发布说明将修复概括为 HSTS 精确字符串匹配。相关变更说明旧行为使用不区分大小写的前缀比较;新版本先提取完整指令名,再与已知名称进行完整比较。
因此解析结果更窄且更可预测:精确有效指令保持其定义;仅以有效名称开头的更长 token 被视为未知;相似名称不应启用子域策略,也不应阻止后续真正有效的指令被处理。
这是解析正确性修复,不代表可以降低 TLS 验证或忽略异常响应头。升级后仍需验证应用依赖的具体行为。
为什么代理工作流需要回归
HSTS 状态由 HTTP 客户端持有,不由代理出口 IP 决定。客户端将请求升级为 HTTPS 后,HTTP 代理可能收到 CONNECT,而不是普通 HTTP 请求;SOCKS 路径也可能承载不同目标端口。TLS 策略、证书验证和连接复用随后都会作用于升级后的目标。
受影响的合法场景包括地区可用性检查、需要保留协议与跳转轨迹的广告验证、跨工作进程复用 HSTS 缓存的网页采集、通过多条授权路由重放 URL 的市场研究,以及升级 libcurl 却未区分旧缓存状态的长期服务。
这并不意味着所有任务都应清空 HSTS,而是必须用受控回归将解析、缓存策略、代理路由和源站行为分开。
构建安全回归环境
使用组织自有的主机名、HTTPS 端点、证书与代理路由,不要向第三方服务发送构造的测试响应头。
准备四个隔离案例:
- 有效的
max-age指令; - 测试父域上的有效
includeSubDomains指令; - 名称仅以
includeSubDomains开头的未知 token; - 以
max-age开头的未知 token,后面再放一个有效max-age。
使用合成主机名和很短、确定的测试周期。保持证书和主机名验证启用,并记录客户端版本、HSTS 缓存身份、输入协议、实际协议、目标端口、代理模式、连接复用与最终结果。
升级流程可参考代理连接池年龄测试,TLS 配置隔离可参考代理 TLS 信任配置指南。
升级后的预期结果
在 curl 8.22 或包含修复的供应商版本中:
- 有效
max-age案例按预期创建或更新策略; - 有效子域案例只在受控父域策略下生效;
- 更长的子域相似名称被当作未知项,不启用子域策略;
- 更长的 max-age 相似名称被忽略,后续精确
max-age仍可处理; - HTTP 到 HTTPS 的升级在代理和 TLS 阶段之前可见;
- HTTPS 证书和主机名验证保持启用。
每个案例先用全新缓存运行,再用同一缓存重复。无保存缓存的新进程作为对照。如果差异只在状态复用时出现,应先检查缓存来源与策略期限,而不是归因于代理路径。
观察完整请求路径
记录测试编号、curl/libcurl 版本、测试案例名称、HSTS 缓存的创建/加载/复用状态、输入和实际 URL 协议、目标主机与端口类别、HTTP 代理/CONNECT/SOCKS 路径、新建或复用连接、TLS 验证结果、跳转次数、最终响应验证,以及缓存更新或到期结果。
不得记录 Cookie、Token、代理密码、私钥、客户 URL 或完整浏览历史。测试环境不得包含生产身份和数据。
在不隐藏状态的前提下升级
确认服务进程实际加载的 libcurl,包括容器、静态程序、语言绑定和 sidecar。升级到 curl 8.22.0,或供应商明确记录包含该修复的版本。
滚动升级时按客户端版本区分测试 HSTS 缓存,以便比较新旧解析结果而不混合状态。按变更流程重启或排空工作进程,同时保留一个受控的升级前测试工件用于对照。不要把生产浏览状态复制到测试环境。
上线后监控异常协议升级、CONNECT 比例、TLS 失败、目标端口变化、HSTS 缓存写入和经过内容验证的成功率。健康部署应保留真实有效指令,并忽略更长的相似名称。
验收清单
- [ ] 服务进程使用 curl/libcurl 8.22.0 或已记录修复的版本。
- [ ] HSTS 缓存位置与所有者明确。
- [ ] 精确指令和相似指令分别测试。
- [ ] 子域相似名称不会启用子域策略。
- [ ] max-age 相似名称不会阻断后续有效指令。
- [ ] 输入与实际 URL 协议均有记录。
- [ ] 代理模式和目标端口有记录。
- [ ] TLS 证书与主机名验证保持启用。
- [ ] 已比较新缓存与复用缓存结果。
- [ ] 连接复用不会掩盖策略变化。
- [ ] 日志不含凭据与生产浏览数据。
常见问题
代理会替 curl 解析 HSTS 吗?
不会。curl 的 HSTS 行为发生在客户端;得到的协议和连接变化随后才决定代理需要承载什么流量。
未知 HSTS 指令会让整个响应头失败吗?
本次修复确保更长的相似 token 走未知指令路径,同时继续处理被识别的指令。仍应测试应用实际依赖的客户端行为。
该修复能替代证书验证吗?
不能。HSTS 可以触发 HTTPS 升级,但客户端仍必须按信任策略验证证书链与主机名。
每次升级都必须清空 HSTS 缓存吗?
不一定。应保留预期策略,但测试状态需要版本化和受控,避免旧解析结果让回归结论含糊。生产缓存处理应遵循安全与变更流程。
来源与合规说明
内部研究依据:curl 项目于 2026 年 9 月 2 日发布的 curl 8.22.0 公告;curl 项目“hsts: match complete directive names”变更,于 8 月 23 日提出、8 月 26 日合并;HTTP 严格传输安全规范。外部资料 URL 仅保存在内部运营记录中,公开文章不含外部链接。
只对自己拥有或获准评估的域名、端点、证书与路由执行解析器和代理测试,并遵守隐私、服务商限制、服务条款和组织变更流程。