HTTP Strict Transport Security 告诉支持的浏览器,在一个缓存周期内对该主机强制使用 HTTPS。这种持久性既是特性也是风险:移除响应头并不会立刻抹掉客户端已存储的策略。

发布轨道要求检查 HTTPS 与重定向、采用短时长示例,并在观察站点与续期后选择时长。域名树将 includeSubDomains 限于发送主机的后代;独立的预加载和恢复面板说明已存策略的限制。
观察后再增加 HSTS 时长,独立决定后代覆盖与预加载。恢复需要有效 HTTPS,也不能立刻抹除所有已存或预加载策略。

先验证 HTTPS 路径

在发送 HSTS 之前,确认规范主机名提供有效证书,并且 HTTP 在不依赖用户输入的情况下重定向到预期的 HTTPS URL:

curl -sS -D - -o /dev/null --max-redirs 0 http://www.example.test/
curl -sS -D - -o /dev/null https://www.example.test/

检查有代表性的深层路由与错误页。HSTS 无法修复证书错误,因为浏览器在接受该策略之前要求有效的 HTTPS 连接。

从一个短的 max-age 开始

分阶段发布能在配置还新的时候限制恢复窗口:

Strict-Transport-Security: max-age=300

观察站点与续期路径之后,再有意识地提高时长。记录日期、所选值与回滚条件。最终策略可能用一年,但这个数字是一种承诺,而不是扫描器分数。

把 includeSubDomains 当作独立的决定

includeSubDomains 把策略扩展到每个子域名。先盘点名称,包括旧服务、委派区,以及只在内部网络使用的主机名。即使只有一个仅 HTTP 的后代,也足以让该选项对收到父级策略的客户端产生破坏。

预加载不是普通的响应头配置

浏览器预加载程序可以在正常响应周期之外分发策略,其要求与移除延迟比设置一个响应头更严格。不要仅仅因为扫描器推荐就申请预加载;请先确认对域名及所有被覆盖名称的长期所有权。

验证公共响应

curl -sS -D - -o /dev/null https://www.example.test/ \
  | awk 'tolower($1) == "strict-transport-security:" { print }'

测试规范的公共边缘,而不只是某个源站端口。代理可能添加、移除或重复该响应头。

知道回滚能清除什么

通过有效 HTTPS 响应发送 max-age=0,只会让收到该响应的客户端清除该主机已学习的策略。移除响应头或通过 HTTP 发送它,都不能清除已缓存策略。子域无法退出父域仍有效的 includeSubDomains;清除父域策略,也不会删除客户端独立从子域学习到的策略。

作用域由发送响应头的主机决定:www.example.test 的策略覆盖自身,加上 includeSubDomains 后覆盖其后代,但不覆盖同级的 api.example.test 或父级 example.test。恢复期间必须保持 HTTPS 可用。移除预加载是独立的浏览器更新过程,不是响应头的即时回滚。

来源