在Apache HTTPD服务器上配置,Web上的许多文章建议通过将所有HTTP请求重定向(永久)到HTTPS来强制执行HTTPS协议。
以下是我了解当用户尝试访问支持HTTP和HTTPS的服务器时所发生的事情:
因此,如果请求包含敏感数据,则在步骤1和步骤2之间,中间人可以在请求中恢复它,非加密。
如果客户端使用Web浏览器,则此浏览器会在缓存中保留301重定向,并且下次客户端使用HTTP发送请求时,它将自动使用HTTPS发送它。
但是,如果客户端经常清除缓存怎么办?或者使用除Web浏览器之外的其他用户代理,它不存储永久重定向? 我们不会在这里失去HTTPS的好处吗?
具体示例:REST API,请求包含敏感数据。可以从任何HTTP客户端调用此API(在线,嵌入软件或网站,独立)。
在这种情况下,为了强制使用HTTPS,在服务器级别上禁用 HTTP支持是否会更好?
编辑2017-11-14:
sys0dm1n告诉我下面的HSTS。但是,这种机制提供的安全性完全取决于用户代理是否符合规范。
编辑2017-11-15:
我收到第一个答案后编辑我的帖子,以确定我的担忧。
答案 0 :(得分:3)
要确保您的网站始终使用https进行安全保护,一种方法是启用HSTS
自动将引用Web应用程序的任何不安全链接转换为安全链接。
要启用它,您需要在vHost配置中添加标题:
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
确保已启用标头模块。
您可以按照说明here添加您的域名,以包含在Chrome的HTTP严格传输安全保护(HSTS)预载列表中。
这是一个将Chrome硬编码为仅限HTTPS的网站列表。
答案 1 :(得分:1)
" 禁用http会完全帮助吗?"
不,我不这么认为,这就是原因:据推测,您的客户端/浏览器在发送请求之前不知道是否存在运行http的站点。当然,它会收到类似404或类似的错误代码,但此时,原始请求将已经通过网络发送,并且任何人在中间"很可能已经能够观察到这一要求。
作为问题的一个简单说明,这里是一个假的http-url的调用,由Postman制作,一个陷入Fiddler的人。如您所见,返回 502错误,但原始请求仍包含敏感数据。
现在只是为了进行比较,如果我这样做,只是将网址更改为 https ,我会在Fiddler中获得不同的结果:
这会尝试设置隧道,但不会显示任何后期数据。
总而言之,您最好的选择可能是启用HSTS并将您的网站设置为HSTS preload list,这应该会阻止任何HTTP请求开始发送(至少recent versions of most major browsers)