尝试删除该always
属性。所以这样做:
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
而不是这个:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
另一个选项是仅在 HTTPS 虚拟主机中设置此选项,而不是在主顶级配置中:
做这个:
<VirtualHost *:443>
(All other virtual host config)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>
而不是这个:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
<VirtualHost *:443>
(All other virtual host config)
</VirtualHost>
这具有必须添加到每个 VirtualHost 才能生效的缺点(或优点取决于您的看法!),而第一个选项将自动应用于所有 HTTPS 虚拟主机。
请,请,请非常小心预加载。不容易逆转!我强烈建议您在提交到预加载列表之前使用良好(即无错误)配置运行几个月 - 看起来您没有这样做。
举一个 preload 可能会给您带来问题的示例:假设您运行https://www.example.com,这也响应http://example.com并将您重定向到https://example.com然后https ://www.example.com(根据预加载提交的要求和您的配置设置)。那么您的网站既可爱又安全。但是,对于在内部重用其域的公司(这很常见),这可能会导致问题 - 尤其是在您预加载时。例如,如果您在http://intranet.example.com上运行一个不公开的非安全站点,或者在http://dev.example.com上运行您的站点的非安全开发版本,那么您可能没有意识到这个站点现在也必须通过 HTTPS 提供服务(因为它是 example.com 的子域)。这很少生效(因为大多数人不访问http://example.com或https://example.com所以永远不会在顶级域上看到这个 HSTS 标头)所以您可能在所有测试期间都不会注意到这个潜在问题. 但是,一旦预加载生效,您的浏览器就会知道顶级域的 HSTS,即使没有访问它,您也会立即失去对那些仅 HTTP 站点的访问,并且无法轻易扭转这一点!许多公司仍然有许多仅通过 HTTP 提供的内部站点和工具,并且在短时间内将它们全部升级到 HTTPS(无论如何都应该这样做!)并不容易。
要解决此问题,请在内部使用不同的域,或者您只能在顶级域上不使用 includeSubDomain 进行设置:
<VirtualHost *:443>
ServerName example.com
(All other virtual host config)
#Set HSTS at top level without includeSubDomain
Header always set Strict-Transport-Security "max-age=31536000"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
(All other virtual host config)
#Set HSTS at subdomain level
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>
这不是很安全(因为有人可以通过 HTTP 设置其他子域,例如http://wwww.example.com(注意四个 W)或http://fake.subdomain.com)但至少它没有破坏那些仅限 HTTP 的站点。此设置将不允许通过预加载列表,因为它需要更安全的 includeSubDomains,即使在顶级域上也是如此。
如果您确实想在顶级域上使用 includeSubDomains,那么我强烈建议您在 HTML 中包含来自顶级域的资源(即使它重定向到 www 版本,因为 HSTS 仍设置为 301s/302s)。这样,即使在您预加载之前,您也可以确保访问者在顶层加载 HSTS 配置。例如,您可以将您的徽标替换为对顶级域的调用:
<img source="https://example.com/logo.png">
运行它,并且有一个小的到期时间,并且暂时没有预加载标签。然后增加有效期。然后,如果一切正常,添加预加载标签并提交到预加载列表。
这听起来可能有点痛苦,也许您已经想到了这一切,但是如果不经过深思熟虑,预加载可能会非常危险,因为它不容易逆转。在我看来,预加载 HSTS 对大多数网站来说都是多余的,尽管我同意它是最安全的选择。