在没有HSTS预加载的情况下,如何使客户端通过HTTPS请求?

时间:2019-01-31 12:21:31

标签: https hsts

如果我使用HTTP http://example.com请求我们的网站,则响应为301 Moved Permanently,且Location标头设置为https://example.com-当然,由于MIM,这是不安全的攻击。

是否有一种方法只是向浏览器做出响应,例如“再次发出相同的请求,但这次是通过HTTPS”,目的是明确告诉浏览器URL?

我原本希望在Troy Hunt的blog post上找到这种解决方案,但是唯一的建议是使用我们不想做的HSTS预加载(即在Google上注册我们的网站)。

1 个答案:

答案 0 :(得分:1)

HTTP严格传输安全性(HSTS)允许您发送HTTP标头,说“下次使用此域-即使用户键入http://或使用以http:开头的链接,也要确保该域通过HTTPS。 //”。

在Apache中,使用以下配置进行设置:

Header always set Strict-Transport-Security "max-age=60;"

这会发送一条消息,告诉浏览器记住该标头60秒钟。确认没有问题时,应增加此值。通常建议设置为63072000(2年)。

因此,它比重定向更安全,因为它自动发生而无需发送不安全的HTTP请求,该请求可以在不安全的网络上被拦截,读取甚至更改。

例如,假设您以前通过家庭WiFi登录到网上银行,浏览器记住了HSTS设置,然后您访问了当地的咖啡店。在这里,您尝试连接到免费WiFi,但实际上是连接到黑客WiFi。如果您使用HTTP链接,书签或通过键入URL进入网上银行,则HSTS将启动,您将立即通过HTTPS进行访问,黑客无法(在合理范围内)对流量进行解密。

所以。一切都很好。您还可以添加includeSubDomains属性:

Header always set Strict-Transport-Security "max-age= 63072000; includeSubDomains"

这增加了额外的安全性。

HSTS的一个缺陷是它要求初始连接来加载此HTTP标头并在将来保护您。在max-age时间之后它也会超时。这就是预加载的地方。您可以将域提交给浏览器,浏览器会将域的HSTS设置加载到浏览器代码中,并将其永久保存,从而确保首次连接都是安全的。

但是I really don’t like preload to be honest。我只是发现事实超出了您的控制范围,很危险。因此,如果您发现某个域未使用HTTPS(例如http://blog.example.comhttp://intranet.example.comhttp://dev.example.com),则一旦预加载生效-BANG,您就强迫自己升级它们,很快,因为直到那时它们都无法访问。从浏览器撤消至少需要几个月的时间,并且很少有人可以忍受这种停机时间。当然,您应该对此进行测试,但这需要转到https://example.com(而不是https://www.example.com)并使用includeSubDomains来完全复制预加载将执行的操作,而并非每个人都这样做。有many, many examples of sites getting this wrong

您还必须问自己在防范什么以及暴露给自己的风险是什么?通过http://链接,黑客拦截程序可以访问cookie(该站点可以通过使用cookie上的secure属性来防止该访问),并可能通过使您保持http://而不是升级来拦截流量。到https://(主要通过HSTS和is increasingly flagged by the browser anyway缓解)。请记住,即使在攻击者的WiFi网络上,绿色的挂锁也意味着连接是安全的(在合理的限制内)。因此,只要您为此寻找(并且您的用户也这样做,我承认这比较困难),风险就相当小。这就是为什么迁移到所有地方的HTTPS,然后默认使用HTTPS如此重要的原因。因此,对于大多数网站,我认为没有预加载的HSTS就足够了,而将控制权留给了网站所有者。