单个端口上同时存在 SSL 和非 SSL

单个端口上同时存在 SSL 和非 SSL

我想让我的 apache2 webserver 在同一个端口上同时提供 http 和 https 服务。
我尝试了不同的方法,但结果要么在 http 上不起作用,要么在 https 上不起作用。

我怎样才能做到这一点?

更新:
如果我启用 SSL,然后使用 http 访问,我得到如下页面:

<!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/"><b>https://server/</b></a></blockquote></p>
<hr>
<address>Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny16 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g Server at server Port 443</address>
</body></html>

因此,在同一端口上同时使用 http 和 https 似乎非常有可能。
第一步是更改此默认页面,使其显示 301-Moved 标头。

更新2: 根据,这是可能的。现在的问题是如何配置 apache 来实现这一点。

答案1

SSL 流量无法在与非 SSL 流量相同的端口上工作,TLS 可以做到这一点,但它不用于 Web 服务器上,TLS 最常用于 SMTP 服务器正是因为这个原因

同样的问题已经被不同的人问过好几次了(见下面的两个例子),而且总是说,单独使用 Apache 是不可能的,你必须使用其他软件或创建某种自己的监听器:

Apache2 在端口 5553 上将 http 重写为 https

Apache 在同一端口上应答 HTTP 和 HTTPS

另外,我找不到任何官方 Apache 文档提及在同一端口上进行 http 和 https 流量而无需进行重定向。

请记住,当人们说 SSL 时,他们通常指的是 SSL/TLS,但它们并不相同。

我认为 apache.org 上的这个答案对于你在同一端口上使用 http 和 https 的问题肯定是“否”

    Can we have both http and https listening on the same port?

Comment 1 Eric Covener 2011-11-22 14:36:45 UTC

No, and bugzilla is not for support or Q&A.  Try the users mailing list.

https://issues.apache.org/bugzilla/show_bug.cgi?id=52228

您可以尝试mod_rewrite 模块但我建议您再开一个问题,了解如何使用它进行 https 重定向(您仍然需要多个端口)。我没有用过它,所以无法向您提供有关如何操作的详细信息。

就像我说的,我对这个模块不太了解,所以我猜你需要三个端口。一个非 SSL 端口用于 mod_rewrite 监听,一个非 SSL 端口用于 http 流量,一个 SSL 端口用于 https,你必须为 mod_rewrite 设置 999 端口,然后让你的服务监听两个不同的 http 和 https 端口。

请注意 Shane Madden 在他的评论中所说的内容,即使您将 mod_rewrite 放在该端口上,启用 SSL 的端口上的 http 请求也只会给您错误。

答案2

可以使用自定义 ErrorDocument 将 http 重定向到 https。
不过,在当前版本的 Apache 中,无法让整个 Web 服务器同时在 http 和 https 上运行。

遗憾的是,Apache 2.2-16 中有一个错误尚未修复,因此重定向仅在 Apache 2.4 中有效。

欲了解更多信息,请参见此处:https://issues.apache.org/bugzilla/show_bug.cgi?id=50823

更新
下面是我使用 apache 2.4 测试的概念验证片段:

<?php
if ($_SERVER["REDIRECT_STATUS"] == "400" && preg_match("/.*?Reason: You're speaking plain HTTP to an SSL-enabled server port\..*/", $_SERVER["REDIRECT_ERROR_NOTES"])) {
    header("Location: https://localhost:999");
} else {
    //echo normal error message
}
?>

通过在您的 apache 配置文件中设置来使用它ErrorDocument 400 /redirect-400-error.php。您可以在自定义 ErrorDocuments 的实现中找到更多信息这里。

答案3

简单的解决方案:

ErrorDocument 400 https://server:port/

现在您会得到“找到”重定向,并且没有任何令人讨厌的错误消息。

答案4

我认为它可以通过定义静态 ErrorDocument 来工作,例如:

错误文档 400 /redirect_https.txt

redirect_https.txt然后在文档根目录中创建包含以下内容的文件:

HTTP/1.1 302 Found
Location: https://www.example.com/mypage.html

这有效(甚至尝试过)并向浏览器发送“伪造的”HTTP 重定向。

相关内容