为什么SSL Labs测试表明在通过HTTP发送标头时启用了HSTS,但是在通过HTTPS发送时却没有?

时间:2017-03-31 05:56:51

标签: http ssl encryption https hsts

我正在尝试在我的服务器上配置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 Labs测试仍然说我没有启用HSTS: https://www.ssllabs.com/ssltest/analyze.html?d=nightowlcircusarts.com

1 个答案:

答案 0 :(得分:1)

一开始,ssllabs不扫描未加密连接上的网站 - 仅限加密连接(https)。所以它不会告诉你你在http上启用它。

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

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

我猜当你“在最初的未加密的HTTP连接上发送HSTS标头”时,你实际在做的是将它设置为无处不在(包括基于https的裸域),这就是为什么你认为它当你这样做时“工作”。

允许(并且预期!)通过https-to-https重定向设置HSTS。事实上,您的具体示例涵盖in the RFC in section 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(我不是粉丝,不认为它应该被广泛使用)。