在我的Plesk Web 管理员版本www.domain.tld
我刚刚在我的主域名上启用了 HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
测试ssllabs.com说一切正常。问题出在我的子域名 ( subdomain.domain.tld
)。如果我在 ssllabs 上测试我的子域名,它会说没有激活 HSTS。
我应该包括标题吗
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
在我的子域名上也一样吗?或者在我的主域名上实施就足够了吗?
我认为通过添加,includeSubDomains
无需在子域上明确添加它。
答案1
该includeSubDomains
部分仅指示浏览器(一旦浏览器看到它),对其他子域的请求应遵守相同的 HSTS 规则(即必须存在有效证书)。它不会“推断”此规则应用于您的子域,例如,如果用户以前从未访问过您的 www.domain.tld 网站。在这种情况下,他们的浏览器永远不会在您的 www 子域上看到此标头的存在,因此不会应用 HSTS 规则。
如果用户有在您的 www 子域上看到此标头,然后尝试访问具有无效证书的子域,它将阻止它并阻止用户继续。
简而言之,您需要确保在所有子域中提供相同的 HSTS 标头,以使其 100% 有效。
答案2
与 CAA 不同,HSTS 不会从所有父域读取。
因此,如果您在 example.com 上设置了它,includeSubDomains
那么如果您只是访问 www.example.com,它将不会被读取。但是,如果您碰巧先访问 example.com,那么它将被设置。因此,基本上您可能会得到不一致的结果。
这可能是因为检查所有父域以查看它们是否也发送带有 HSTS 标头会对性能(和隐私!)产生影响includesubdomains
。
因此应该在所使用的域上设置也任何父域。
现在,即使这样也往往不足以提供全面保护。例如,如果您在 www.example.com 上发送和在 example.com 上,但 example.com 通常不被访问,那么大多数网站访问者只会将 www 变体缓存为 HSTS 域。因此,至少一次请求可能通过 HTTP 访问 example.com。因此,建议在访问您的 www 域时通过 HTTPS 从您的基本域加载一个资产(例如图像) - 这样两个 HSTS 策略都会加载。还建议重定向为 example.com ->https://example.com->https://www.example.com而不是直接访问 example.comhttps://www.example.com尽管额外的重定向会对性能产生影响,但仍选择任何 example.com HSTS 策略。
并且每个级别都可以有不同的策略。例如,如果您有一些未使用 HTTPS 的子域(例如 intranet.example.com),那么您可以在顶层使用 HSTS 策略,而无需使用 ,而includeSubDomains
在 www.example.com 使用不同的 HSTS 策略includeSubDomains
。
所有这些的替代方案是预加载域。这会在浏览器代码中对整个域(通常是所有子域)进行硬编码,因此即使是第一次访问也会受到保护。这也不会对性能产生影响,因为检查所有父域做只需输入一个即可生效includeSubDomains
。但预加载是一项严肃的承诺,不应轻易做出,因为它基本上是不可逆转的。此外,除非您的所有子域都是 HTTPS,否则您无法预加载 - 我们至少会在不要求特殊预加载的情况下进行预加载。另一个原因是从顶级域加载图像,以便获取基本策略前任何不可逆的预加载都会生效!
总而言之,这很复杂!:-) 但值得付出努力去理解它并正确对待它。