apache 将HTTP重定向到HTTPS还是拒绝使用HTTP?

plicqrtu  于 2023-05-18  发布在  Apache
关注(0)|答案(2)|浏览(115)

在Apache HTTPD服务器上进行配置,网络上的许多文章建议通过将所有HTTP请求重定向(永久)到HTTPS来强制执行HTTPS协议。
下面是我所理解的,当用户试图访问支持HTTP和HTTPS的服务器时发生的情况:
1.客户端的用户代理(例如,但不仅仅是Web浏览器)向http://my.domain.com发送请求。
1.服务器在端口80上接收请求,并向https://my.domain.com发送永久重定向(代码301)。
1.客户端的用户代理接收响应。给定状态码,它会向https://my.domain.com发送相同的请求。
1.服务器在端口443上接收请求并发回想要的内容。
因此,如果请求包含敏感数据,则在步骤1和2之间,中间人可以在请求中恢复它,不加密。
如果客户端使用Web浏览器,此浏览器会在缓存中保留301重定向,下次客户端使用HTTP发送请求时,它会自动使用HTTPS发送请求。
但是,如果客户端经常清除该高速缓存呢?或者使用不存储永久重定向的Web浏览器以外的其他用户代理?我们不会失去HTTPS的好处吗?

具体例子:REST API,并且请求包含敏感数据。此API可以从任何HTTP客户端调用(在线,嵌入软件或网站,独立)。
在这种情况下,是否更好地在服务器级禁用HTTP支持,以强制使用HTTPS?
编辑2017-11-14:

sys 0 dm 1 n在下面告诉我HSTS。但是这种机制提供的安全性完全取决于用户代理对规范的遵从性。

编辑2017-11-15:

我在收到的第一个答案后编辑了我的帖子,以明确我的担忧。

smtd7mpg

smtd7mpg1#

要确保您的网站始终使用https进行安全性,一种方法是启用HSTS
自动将引用Web应用程序的任何不安全链接转换为安全链接。
要启用它,您需要在vHost配置中添加一个标头:

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

确保已启用Header模块。
您可以按照here的指令添加您的域名,以便包含在Chrome的HTTP严格传输安全(HSTS)预加载列表中。
这是一个硬编码到Chrome中的网站列表,仅限HTTPS。

lrpiutwd

lrpiutwd2#

"* 完全禁用http会有帮助吗?"
很可能会。我正在更新和更改我2017年的答案,因为正如用户kamilz在下面的评论中指出的,我显然太草率了,得出了错误的结论。引用Kamilz的话:
如果目标服务器是已知的,但它没有侦听端口80(或者端口80被阻塞),TCP握手应该失败,并且仍然不会通过线路发送HTTP数据。如果它监听80,它将接受TCP连接,数据将以明文形式通过线路发送。
这当然有道理。那么,为什么我可以在下面的图片中看到敏感数据呢?Kamilz也解释说:
Fiddler充当Web代理,这就是为什么它能够看到原始请求。
这些数据根本还没有发送-它仍然在我的机器上,而且还没有执行DNS查找。在通过Fiddler之后的某个时间点,DNS查找将被执行,但不会找到有效的IP地址1,并且由于将没有有效的IP,将根本没有地方发送内容。
1.也就是说,假设没有人注册地址http://somefakeurlthatdoesnotexistanywhare.com,加上我愚蠢的拼写错误等等)*。

上一次回答错误

    • 在上下文中,这是我最初的答案(谁知道呢,它甚至可能是启发性的,并帮助其他人避免得出相同的错误结论):**

不,我不这么认为,原因是:据推测,您的客户端/浏览器在请求发送之前不知道运行http的站点是否存在。当然,它会收到一个错误代码,比如404或类似的代码,但是在那一点上,原始请求已经通过电线发送了,任何“中间人”都可能已经能够观察到该请求。
作为这个问题的一个简单说明,这里有一个对一个假http-url的调用,它来自Postman,一个在Fiddler中捕获的。如您所见,返回502错误,但原始请求仍然包含敏感数据。

现在只是比较一下,如果我做了同样的操作,但只是将url改为https,我在Fiddler中得到了不同的结果:

这试图建立一个隧道,并且不显示任何后期数据。
因此,最好的选择可能是启用HSTS并在HSTS preload list上获得您的网站,这应该停止任何HTTP请求被发送(至少对于大多数主流浏览器的最新版本)。

相关问题