带有mod-proxy和SSL的Apache VirtualHost


28

我正在尝试建立一个具有多个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:8443是可访问的,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:8443时获得的正确访问请求:

"GET / HTTP/1.1" 302

最后,我还要提到的一点是,当我不使用SSL时,虚拟主机可以正常工作。

我该如何进行这项工作?

Answers:


34

最后,我找到了一种使其工作的方法。首先,我尝试了Dave Cheney的建议,因此我为apache服务器安装了另一个证书,该证书已重定向到Tomcat非SSL端口(因此,代理服务器已重定向到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>

1
避免ProxyPreserveHost On它几乎总是错误的,无用的并且几乎总是会中断ProxyPassReverse。附带说明ProxyRequests off是默认值,因此是多余的。
kubanczyk

当我们使用外部IP而不是localhost它不起作用时。
Chaminda Bandara

4

试试这个配置

<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连接器。


我将在运行host.domain.org应用程序的服务器上进行加密来生成证书。然后,我必须在代理服务器上重用同一证书?
Giox

2

但是,如果您的目标是在同一服务器上运行多个启用了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

目前,我确实不需要使用负载平衡,但是将来可能会很有用。感谢您的见解。
JMD

1

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

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

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


好吧,我有两个选择这种设置的理由。首先是Tomcat服务器已经启动并以SSL运行,我认为将apache VirtualHost与它一起使用会很简单。第二个是应用程序的提供者(JIRA)提供了一些关于apache集成的准则(atlassian.com/software/jira/docs/v3.13/apacheintegration.html),我通过添加VirtualHost支持在其基础上进行配置。猜想这比我想象的要复杂,除了使它起作用之外,我真的很想知道问题出在哪里。
JMD

0

您是否真的需要代理HTTPS服务?您可能要代理到本地主机中的non-ssl服务,例如

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

确实,对我来说,必须使用SSL。我还测试了不使用SSL进行检查就可以代理的情况,并且工作正常。SSL支持是真正的问题。
JMD

0

首先,我将研究您是否可以从localhost到localhost:8443进行请求,看看是否成功(即GET或wget http:// localhost:8443

我不太确定为什么您的havin ga虚拟主机侦听端口443,然后将其代理到另一个SSL主机

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


原因是我需要在同一台服务器上安装更多的Web应用程序,全部使用SSL,并且它们都不能全部侦听端口443。因此,我使用基于IP的VirtualHosts使其看起来像每个Web应用程序都托管在其自己的服务器上。我测试了以下wget命令,它运行正常:wget localhost:8443 --no-check-certificate
JMD 2009年

2
注意-向服务器添加其他IP地址很简单,因此有多个应用程序监听端口443-所有这些应用程序都位于单独的IP地址上。
布伦特

0

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


如果确实存在验证错误,那么解决方案是什么?
哈维尔·
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.