it-swarm.cn

带有mod-proxy和SSL的Apache VirtualHost

我正在尝试设置具有多个Web应用程序的服务器,这些服务器都将通过Apache VirtualHost(在同一服务器上运行的Apache)提供服务。我的主要约束是每个Web应用程序必须使用SSL加密。经过一段时间的搜索并查看关于stackoverflow的其他问题之后,我为VirtualHost编写了以下配置:

<VirtualHost 1.2.3.4:443>
    ServerName Host.example.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>

即使 https://Host.example.org:844 可以访问,但 https://Host.example.org 不可访问,这违背了我的虚拟主机的目的组态。 Firefox抱怨说,即使成功连接到服务器,连接也被中断。我还在Apache的error.log中得到以下警告:

proxy: no HTTP 0.9 request (with no Host line) on incoming request and preserve Host set forcing hostname to be Host.example.org for uri 

在Web应用程序(Tomcat服务器)上,访问日志显示了一个奇怪的访问请求:

"?O^A^C / HTTP/1.1" 302

以下是我直接连接到 https://Host.example.org:844 时获得的正确访问请求:

"GET / HTTP/1.1" 302

最后,我还应该提到,当我不使用SSL时,虚拟主机可以很好地工作。

我该如何进行这项工作?

28
JMD

最后,我找到了一种使其工作的方法。首先,我尝试了Dave Cheney的建议,因此为重定向到Tomcat非SSL端口的Apache服务器安装了另一个证书(因此,代理服务器已重定向到 http:// localhost:8080 / )。不幸的是,它不能完全正常工作,因为在Web浏览器中,https在连接后立即转换为http。因此,我恢复使用 https:// localhost:8443 / ,最后使其生效的方法是再次添加SSLProxyEngine。

这是生成的VirtualHost配置:

<VirtualHost 1.2.3.4:443>
    ServerName Host.domain.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLEngine on
    SSLProxyEngine On
    SSLCertificateFile /etc/Apache2/ssl/certificate.crt
    SSLCertificateKeyFile /etc/Apache2/ssl/certificate.key

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>
35
JMD

试试这个配置

<VirtualHost 1.2.3.4:443>
    ServerName Host.domain.org

    SSLEngine On
    # include other ssl options, like cert and key here

    ProxyRequests Off
    ProxyPreserveHost On

    <Location />
        ProxyPass http://localhost:8443/
    </Location>
</VirtualHost>

如果您的应用程序需要从代理连接访问SSL信息,则应考虑使用mod_proxy_ajp和Tomcat ajp1.3连接器。

4
Dave Cheney

但是,如果您的目标是在同一服务器上运行多个启用了ssl的Web应用程序。在前面添加Apache并不会使用上述配置来平衡它们,您仍然需要负载平衡器,或者可以将Apache的代理平衡器模块与以下内容结合使用:

ProxyRequests Off

<Proxy balancer://someapplication>
    BalancerMember http://127.0.0.1:18443 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18444 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18445 keepalive=on max=2 retry=30
</Proxy>


<VirtualHost 1.2.3.4:443>
    SSLEngine on
    SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile //path/to/key.pem
    SSLVerifyClient optional

    RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
    RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

<Location />
    SetHandler balancer-manager
    Order allow,deny
    Allow from all
</Location>

ProxyPass / balancer://someapplication:443/
ProxyPassReverse / balancer://someapplication:443/
ProxyPreserveHost on
2
Brendan

好吧,我在这里不明白的是为什么您需要从Apache到应用程序的SSL连接,而该SSL连接似乎位于同一台计算机上( http:// localhost:8443 / )。

我猜通常的设置方法是让Apache向“客户”端提供SSL加密,例如Internet,并且与应用程序之间存在未加密的连接。这也使您有更多的自由来调试应用程序响应。

Dave Cheney提到的另一件事是使用本机Tomcat连接器以具有负载平衡和其他功能。

1
zero_r

您是否真的需要代理HTTPS服务?您可能想要代理到本地主机中的非SSL服务,例如.

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
0
codehead

首先,我将研究是否可以从本地主机发送到本地主机的请求:8443,看看是否成功(IE执行GET或wget http:// localhost:844

我不太清楚为什么您要让虚拟主机监听端口443,然后将其代理到另一个SSL主机

为什么应用程序不能仅使用443本机?如果您无法更改它,则可以使用iptables重定向端口

0
Brendan

检查您的SSL错误日志,并确保您没有关于无法验证CA证书链的错误。

0
Neobyte