0

我正在尝试在我的服务器上配置 HSTS。我注意到,如果我通过初始未加密的 HTTP 连接发送 HSTS 标头,SSLLabs.com 上的测试会告诉我 HSTS 已启用。但是,这违反了 RFC-6797 第 7.2 节中的 HSTS 规范,该规范明确指出您不应通过未加密的连接发送此标头。

另一方面,如果我的服务器仅在执行从 HTTP 到 HTTPS 的 302 重定向后才发送该 HSTS 标头,这正是官方 HSTS 规范所说的你应该做的,那么 SSL Labs 不会承认我启用了 HSTS。

那么我在这里错过了什么?执行此操作的实际正确方法是什么?


如果你想看看我在说什么,有问题的网站是 nightowlcircusarts.com

您可以通过以下 bash 命令使用 curl 查看未加密的标头:

curl -I http://www.nightowlcircusarts.com/

或者将该 http 更改为 https 以查看加密的标头:

curl -I https://www.nightowlcircusarts.com/

目前,我将其配置为仅通过 TLS 发送该标头,而不是没有它,正如 HSTS 规范所说的那样。但是您会看到 SSL 实验室测试仍然显示我没有启用 HSTS: https ://www.ssllabs.com/ssltest/analyze.html?d=nightowlcircusarts.com

4

1 回答 1

1

首先,ssllabs 不会扫描未加密连接上的站点 - 仅扫描加密连接 (https)。所以它不会告诉你你在http上启用了它。

您的问题是 nightowlcircusarts.com 和www.nightowlcircusarts.com是两个不同的网站,您只是在后者上设置它,但在前者上扫描它:

现在扫描结果在底部确实显示裸域确实重定向到 www 版本,但 ssllabs 的任务是测试 SSL/TLS 连接(发生在重定向之前),因此它故意不遵循重定向而是报告SSL/TLS 连接配置。它希望您单独扫描重定向站点 - 正是针对像这样您设置不同的用例!

我猜当您“通过初始未加密的 HTTP 连接发送 HSTS 标头”时,您实际上正在做的是将其设置在任何地方(包括通过 https 的裸域),这就是为什么您在这样做时认为它“有效”的原因。

通过 https-to-https 重定向设置 HSTS 是允许的(也是预期的!)。事实上,您的具体示例已在 RFC 的第 11.4.1 节中介绍

顺便说一句,将 HSTS 添加到裸域是最佳实践,但请确保您的整个域仅通过 https 提供服务。如果您有一个子站点(例如 blog.example.com),或者也将其用于尚未保护的非公共站点(例如 intranet.example.com),那么这可能会导致问题。在这种情况下,您可以将 HSTS 添加到裸域但没有 includeSubdomain 选项 - 尽管这不会为您提供 HSTS 的全面保护。

最后,如果检查站点的各种安全标头而不是 SSL/TLS 配置,那么https://securityheaders.io是一个很棒的站点,并且运行起来比 ssllabs 所做的整套 SSL/TLS 测试要快得多:

请注意,这两个站点检查不同的内容,因此我们不是替换另一个站点(两者的忠实拥护者!),但两者都显示了一些设置(HSTS 和 HPKP)。虽然在这个问题上要非常小心 HPKP(我不是粉丝,也不认为它应该被广泛使用)。

于 2017-03-31T07:23:17.000 回答