首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache拒绝在非默认虚拟主机上通过SSL进行HTTP连接

Apache拒绝在非默认虚拟主机上通过SSL进行HTTP连接
EN

Server Fault用户
提问于 2016-04-14 01:29:46
回答 3查看 2.7K关注 0票数 3

我有一个Apache2.4.18服务器运行在多个vhost上。

/etc/apache2/sites启用/000-default.conf:

代码语言:javascript
复制
<VirtualHost *:80>
    DocumentRoot /var/www/html
    Redirect 400 /
</VirtualHost>

/etc/apache2/sites-enabled/000-default-ssl.conf:

代码语言:javascript
复制
<VirtualHost _default_:443>
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>

/etc/apache2/sites启用/001-custom.conf:

代码语言:javascript
复制
<VirtualHost _default_:443>
    ServerName www.example.org

    Include /etc/apache2/letsencrypt/main.conf
    SSLCertificateFile      /etc/letsencrypt/live/example.org/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem

    Include /etc/apache2/proxytunnel/main.conf
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.org
    Redirect permanent / https://www.example.org/
</VirtualHost>

/etc/apache2/proxy隧道/main.conf:

代码语言:javascript
复制
ProxyRequests On
AllowConnect 2222
<Proxy *>
    Order deny,allow
    Deny from all
</Proxy>
<Proxy 127.0.0.1>
    Order deny,allow
    Allow from all
</Proxy>

我还在同一台计算机的端口2222上运行了一个运行的SSH服务器。

如果我使用来自远程计算机的proxy隧道通过SSL访问SSH服务器,则使用apache作为代理服务器:

代码语言:javascript
复制
proxytunnel -v -E -p www.example.org:443 -d 127.0.0.1:2222

我得到以下错误:

代码语言:javascript
复制
SSL client to proxy enabled
Local proxy www.example.org resolves to xxx.xxx.xxx.xxx
Connected to www.example.org:443 (local proxy)

Tunneling to 127.0.0.1:2222 (destination)
Communication with local proxy:
 -> CONNECT 127.0.0.1:2222 HTTP/1.1
 -> Host: 127.0.0.1:2222
 -> Proxy-Connection: Keep-Alive
 <- HTTP/1.1 405 Method Not Allowed

HTTP return code: 405 Method Not Allowed
 <- Date: Thu, 14 Apr 2016 00:55:57 GMT
 <- Server: Apache/2.4.18 (Debian)
 <- Allow: GET,HEAD,POST,OPTIONS
 <- Content-Length: 309
 <- Content-Type: text/html; charset=iso-8859-1

但是如果我把文件/etc/apache2/proxytunnel/main.conf包含在我的/etc/apache2/sites-enabled/000-default-ssl.conf vhost中,它就能工作.

代码语言:javascript
复制
SSL client to proxy enabled
Local proxy www.example.org resolves to xxx.xxx.xxx.xxx
Connected to www.example.org:443 (local proxy)

Tunneling to 127.0.0.1:2222 (destination)
Communication with local proxy:
 -> CONNECT 127.0.0.1:2222 HTTP/1.1
 -> Host: 127.0.0.1:2222
 -> Proxy-Connection: Keep-Alive
 <- HTTP/1.0 200 Connection Established

 <- Proxy-agent: Apache/2.4.18 (Debian)

 Tunnel established.
 SSH-2.0-OpenSSH_7.2p2 Debian-2

因此,我的结论是,要使连接请求通过SSL通过apache服务器工作,除了发出实际的vhost之外,还必须将AllowCONNECT指令放在apache代理端口的默认vhost中。

请注意,当使用(而不是HTTPS)时,该行为不会被再现,并且在proxy隧道中禁用加密。而且,由于请求被正确地转发到apache并存在于服务器日志中,所以这个问题并不来自vhost隧道:是apache主动拒绝它,因为它认为此服务器上的HTTP方法(CONNECT)无效(尽管它在所关心的vhost中是允许的)。

EN

回答 3

Server Fault用户

回答已采纳

发布于 2016-04-15 09:48:28

而且,由于请求被正确地转发给apache,并且在服务器日志中存在,所以这个问题不是来自problem隧道。

这是错误的,proxy隧道在我使用的版本中不支持SNI (在本文发布之日,来自他们存储库的最近提交,所以如果我信任他们的发布标签,那么稍微领先于1.9.1 )。

其结果是,apache选择的vhost是默认的vhost,无论我试图连接到哪个主机。

票数 1
EN

Server Fault用户

发布于 2018-06-04 11:41:59

我想通过对我自己的经验提供反馈来补充这个问题。我还不能发表评论。

我在Windows 7上使用Proxy隧道1.9.9 (大约2018年4月),这是我从使用Cygwin 32位的源代码编译的。

从我的测试中,我发现Proxy隧道与-p参数中的ServerName与Apache2 Virtualhost中的主机名不正确匹配。除非包含AllowCONNECT方法的虚拟主机是默认的Virtualhost,否则使用proxy隧道通过一个http或https本地代理将失败。

列出在Apache中启用的Virtualhost,并查看哪一个是默认的:

代码语言:javascript
复制
apachectl -S

在我的设置中,每个虚拟主机都在自己的站点可用目录中的文件中。运行以下命令:

代码语言:javascript
复制
ls -1

站点可用目录中列出的第一个文件是apache2将成为默认虚拟主机的虚拟主机。通过这种方式,我将我的http (或https)转发代理交换为默认的、第二行的虚拟主机.通过更改其名称,使其不会首先出现在目录列表中。

我发现这个用于http本地代理的命令:

代码语言:javascript
复制
proxytunnel -v -p http-forward-proxy.com:80 -d 192.168.0.10:22

或https本地代理的以下命令:

代码语言:javascript
复制
proxytunnel -v -E -C root.pem https-forward-proxy.com:443 -d 192.168.0.10:22

如果OpenSSH方法位于默认的Virtualhost中,则给出AllowCONNECT横幅,但如果它不是.即使非默认端口80虚拟主机包含:

代码语言:javascript
复制
ServerName http-forward-proxy.com

或者在向https转发代理进行代理的情况下,当非默认端口443虚拟主机包含:

代码语言:javascript
复制
ServerName https-forward-proxy.com

我查看了Apache2日志,确认的处理总是进入默认的虚拟主机。

我还在Proxy隧道GitHub页面https://github.com/proxytunnel/proxytunnel/issues/31上发布了一个关于HTTP的“问题”

然而,

我在sslh和stunnel服务器端使用Proxy隧道客户端。在这个场景中,我发现Proxy隧道命令中的主机名与sslh中的sni_hostnames{}特性匹配,因此在这种情况下,主机名似乎确实正确传输,至少在加密和使用SNI时是这样。

票数 1
EN

Server Fault用户

发布于 2018-06-07 02:42:25

谢谢你的提问和你的结论。多亏了你,我现在有了一个工作装置!使用apache默认的vhost运行得很好。

不过,我想知道Proxy隧道的SNI是否真的是问题所在。在我的例子中,我有https://app1.example.com,它是apache的默认vhost,还有另一个vhost https://example.com。我的letsencrypt有一个通用名称app1.example.com,主题名是example.com。

如果我将ProxyRequests on添加到example.com中,它就没有任何效果。如果我把它移到app1.example.com,它就能正常工作。

我的理解是,对于多个vhost来说,一个ip上的一个证书不需要SNI。

此外,我在测试中使用curl,就像在curl -v -x https://example.com https://somethingelse.com中一样。Curl支持SNI,我使用wireshark进行了检查:它在握手扩展中为CONNECT请求和GET请求发送正确的主机名。我还是得到了405 Method Not Allowed

因此,问题似乎在于mod_proxy没有被正确激活。你认为如何?

我在阿帕奇2.4.25。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/770185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档