Apache:将不安全的请求发送到安全端口…要重定向


9

前言

首先:一个简单的端口80->端口443重写无法解决此问题。在几乎之前的每个问题(邮件主题,论坛主题等)中,我发现这是第一个无知的响应,并且被多次模仿。

其次:是的,我知道您不能在同一端口上提供HTTP和HTTPS通信。 不是那样的

场景:

Apache Server通过端口乘法托管多个站点。80端口是一个公共站点。端口443提供该站点的安全版本。

端口7443、8443和9443分别服务于单独的SSL安全站点。

如果用户输入了错误的URL,或者给出了无效的链接,请说出http://hostname.tld:7443,并为他们提供以下荒谬页面:

Apache Bad Request错误消息

代替服务器,只需将它们重定向到https://hostname.tld:7443

我的问题是,如何以Zeus的屁眼的名义修改Apache的行为或此错误消息以自动重定向用户?

即使为HTTPS配置了Apache,Apache显然仍在处理非https请求(以显示该错误消息)。对我而言,不仅默认情况下进行重定向似乎非常愚蠢,而且即使我不同意我的理解,我仍然可以理解为什么他们采用了他们的行为。所以我的问题是:您可以更改它吗?他们正在处理错误SOMEWHERE,并且将Apache作为配置的聚宝盆,这可以说是在某处处理该行为的指令,但到目前为止,我在进行了几个小时的修补后仍无法找到它。

更新:

我尝试了多种方法,包括:

  • 使用ErrorDocument 400指令来获取仅发送Status 301Location标头的CGI和PHP脚本。这将导致空白页。ErrorDocument 400 https://hostname.tld:7443简单地使用将导致该链接显示在页面上。

  • 几乎mod_rewrite可以使用I或Google的所有组合,包括完全指导该网站的全面声明;这些永远都行不通。从字面上看,他们什么都不做。我猜想Apache甚至在尝试处理重写指令之前都会出现上述错误。

由于自定义端口的使用,我无法使用基于端口的重定向。我无法使用基于脚本的重定向,因为由于http / https不匹配,它们无法得到服务。我几乎愿意将其归结为错误或意外行为,但是有人预见到了要在其中放置非常自定义的错误消息的想法,他们没有理会您可能只是想将其发送到他们已经提供了 URL ?



丹尼尔(Daniel),这是我在发布此问题之前发现的许多问题和尝试的解决方案之一。我认为问题出在PHP组件,但是由于@hrunting的答案的更新目前对我来说效果很好,所以我不会花更多的时间在它上面。至少直到我必须这样做。
Peelman

2
支持链接的视频,它完美地传达了我的情感
michele b

Answers:


6

我认为这可能是Apache 2.2及更低版本如何处理这种特殊情况的错误。

似乎在发生SSL读取400 Bad Request错误时,Apache 2.2不会返回HTTP响应代码或标头,而仅返回HTTP响应正文。我通过远程登录到端口443并发送来进行测试:

GET / HTTP/1.1

服务器立即返回(对我来说):

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
<blockquote>Hint: <a href="https://server.tld/"><b>https://server.tld/</b></a></blockquote></p>
</body></html>

请注意缺少HTTP响应代码或任何HTTP标头。

当我对Apache 2.4服务器执行此操作时,我得到:

HTTP/1.1 400 Bad Request
Date: Sun, 10 Feb 2013 00:47:23 GMT
Server: Apache/2.4.3 (Unix) OpenSSL/1.0.0g
Content-Length: 462
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
</p>
<hr>
<address>Apache/2.4.3 (Unix) OpenSSL/1.0.0g Server at server.tld Port 443</address>
</body></html>

如果我像您一样设置ErrorDocument行:

ErrorDocument 400 https://server.tld/

然后,我获得了302重定向的HTML,但是同样,没有任何标头。没有302重定向响应代码和Location:标头,浏览器将无法重定向。

尝试升级到Apache 2.4,看看它是否有效。我已经至少使用Apache 2.4.3进行了测试和确认,但是我还没有进行确切的行为更新时间。我怀疑他们在准备2.4的大量工作中都将不良行为作为副作用进行了纠正。

相关的Apache httpd错误:

更新

您可以通过让脚本打印出其标头(不会发送到客户端),然后再手动输出所需的标头,来强制有问题的Apache为您提供所需的行为(重定向)。这是在Apache 2.2.22下工作的基本Perl脚本:

#!/usr/bin/perl

use strict;
use CGI;

my $q = CGI->new();

# this will cause Apache to handle the response properly, but is meaningless otherwise
print $q->redirect("https://localhost/");

# this actually performs the redirect
print "HTTP/1.1 302 Found\r\n";
print "Location: https://localhost/\r\n";
print "\r\n";

# you can do whatever you want here; this will be the HTML body

您应该意识到,除了仅与不带SSL的SSL端口通信外,还有其他原因可能会生成400。确定这一点的简单方法是寻找HTTPS环境变量。如果已设置,则说明SSL已正确协商,并且其他原因导致了400(如果是这种情况,请勿执行双重标头技巧)。如果HTTPS未设置,则按上述方式返回您的重定向。


1
圣。废话 完美答案。格拉西亚斯。
Peelman

您知道,当我读到这篇文章时,我对自己说:“伙计,如果您拥有Apache 2.2并且想要这种重定向行为,那真是太糟糕了。” 我不会为Ubuntu系统找到合适的Apache 2.4 deb(或自己创建)的工作。我敢打赌,您可以从您的PHP脚本中破解一个解决方案。Apache显然只是将输出转储到客户端,因此,如果您返回特定的预期内容,我敢打赌,无需升级Apache就可以得到想要的行为。尝试让您的PHP脚本打印出“ HTTP / 1.1 302 Found \ r \ n位置:server.tld \ r \ n \ r \ n”。
降落

那里的问题是,似乎没有正在处理PHP脚本。我应该注意,这是当前坐在Ubuntu Server 12.04上的Apache 2.2.22上的结果。是的,确实非常糟糕;尤其是当您注意到在这些错误报告中时,它们似乎完全被设置为甚至不提供自动执行重定向的选项,并且似乎不太希望2.2能够得到修复。
Peelman

1
就像我在上面说的那样,对于您来说,为什么麻烦去编写该错误消息,而不是重定向到安全(严重,为什么不重定向呢?我思考得越多,就越少我认为这是个坏主意)。
Peelman

1
我已经刺穿整个文件系统,以查找该流血消息的文本,以查看我是否可以<javascript从中窃取该消息,在不大可能的情况下,我可以注入一个标签,并很幸运地以这种方式进行黑客重定向,但是到目前为止,还没有骰子。似乎没有采取任何其他方式来解决此问题,否则该方法将遵循原本相当僵化的Apache
令人敬畏

-1

您可以使用mod-rewrite解决此问题。设置规则以匹配任何内容。在Stackoverflow上查看此答案


不,我已经尝试过了,它不起作用。就像它甚至没有进入ModRewrite步骤一样,因为它首先遇到了http / https不匹配的问题。
Peelman

Hrm,所以我认为您已经从您的apache配置文件的顶部开始,并逐步研究它的含义
trent

我几乎已经记住了整个sites-available目录。即使您只是将其重定向到废话,或将其重定向到其他站点,其他端口等,它也只会继续加载该400 Bad Request。
Peelman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.