在Tomcat前面使用Apache进行SSL设置


9

我试图用SSl设置Apache并将SSL请求代理到我的tomcat实例。我认为我已使SSL正常工作,但仍然显示错误:

Bad Gateway

The proxy server received an invalid response from an upstream server.

* SSL虚拟主机*

LoadModule ssl_module modules/mod_ssl.so

Listen 443
<VirtualHost _default_:443>
SSLEngine On
SSLProxyEngine On
DocumentRoot "/var/apache-tomcat-7.0.34/webapps/Learn2Gether/"

SSLCertificateFile /etc/pki/tls/learn2gether/cert-6090205098829887.pem
SSLCertificateKeyFile /etc/pki/tls/learn2gether/private_key_unlocked.pem
SSLCertificateChainFile /etc/pki/tls/learn2gether/rubca-chain.pem


BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

ServerName www.learn2gether.rubel.rub.de
ServerAlias learn2gether.rubel.rub.de

#RewriteRule ^\/$ /Learn2Gether/index.html [PT]
##RewriteRule ^/(.*)$ /$1 [PT]

ProxyRequests Off
ProxyPreserveHost On
ProxyPass / https://localhost:8443/
ProxyPassReverse / https://localhost:8443/

</VirtualHost>
~               

HTTP VH重定向到HTTPS

NameVirtualHost *:80

<VirtualHost _default_:80>
   ServerName www.learn2gether.rubel.rub.de
   ServerAlias learn2gether.rubel.ruhr-uni-bochum.de
RewriteEngine on
# DocumentRoot "/var/apache-tomcat-7.0.34/webapps/Learn2Gether/"
RewriteCond %{HTTP_HOST} !^learn2gether.rubel.ruhr-uni-bochum\.de [NC]
RewriteRule ^/(.*)$ http://learn2gether.rubel.ruhr-uni-bochum.de/$1 [R=301,L]

RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}$1 [L]

#RewriteRule ^\/$ /Learn2Gether/index.html [PT]
#RewriteRule ^/(.*)$ /$1 [PT]

#ProxyPass / https://localhost:8443/
#ProxyPassReverse / https://localhost:8443/
</VirtualHost>

Tomcats Apache连接器

    <Connector port="8443"
  protocol="HTTP/1.1"
   connectionTimeout="20000"
    compression="on"
     compressionMinSize="32"
      noCompressionUserAgents="gozilla, traviata"
       compressableMimeType="text/html,text/xml,text/javascript,application/x-javascript,text/css"
        redirectPort="8443"
         URIEncoding="UTF-8"
          proxyPort="443"
           proxyName="learn2gether.rubel.ruhr-uni-bochum.de"
            scheme="https"
             secure="true"
/>

Tomcat服务器是否配置了自签名证书?另外,如果您将apache用作tomcat的ssl前端,为什么还要在tomcat服务器上也使用ssl?最佳做法是让您的tomcat响应http,并将https卸载到apache服务器。
克里斯特·范·贝西恩

Answers:


14

将http或https代理到https时,需要将apache配置为ssl 客户端。当apache与您的Tomcat服务器通信时,它毕竟充当Web客户端。但是,Apache通常无法立即用作SSL客户端。

首先,我建议您首先考虑是否确实需要这样做,为什么要这样做。当Tomcat和Apache驻留在同一服务器上时,通常的做法是让Tomcat仅提供普通的http(或ajp)并将ssl卸载到Apache服务器。apache和tomcat服务器之间通常不需要ssl。在Tomcat服务器上没有ssl将为您节省很多麻烦。

您所需要做的就是例如在tomcat实例的端口8080上定义一个HTTP连接器,然后从您的Apache SSL虚拟主机中重定向所有请求:

<VirtualHost _default_:443>
SSLEngine On

SSLCertificateFile /etc/pki/tls/learn2gether/cert-6090205098829887.pem
SSLCertificateKeyFile /etc/pki/tls/learn2gether/private_key_unlocked.pem
SSLCertificateChainFile /etc/pki/tls/learn2gether/rubca-chain.pem


BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

ServerName www.learn2gether.rubel.rub.de
ServerAlias learn2gether.rubel.rub.de

ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

</VirtualHost>

但是,如果您仍然决定需要ssl到ssl代理,则需要添加更多更改。Apache需要能够充当SSL客户端以及SSL服务器。当Apache使用https与另一台服务器通信时,毕竟是由客户端承担的。这不是那么容易,而且您会遇到很多问题。您将需要添加以下内容:

# turn on SSL proxying.
SSLProxyEngine On

# to tell Apache where to find CA certificates to check server certificates with:
# (You can choose yourself where you put these certificates)
SSLProxyCACertificatePath /path/to/ca/certificates.

然后,在此路径中,您需要放入用于对与之通信的服务器使用的证书进行签名的CA证书。如果您使用“自签名”证书,则需要将其放在此目录中。

完成后,需要在该目录中运行“ c_rehash”。c_rehash是标准openssl发行版的一部分。c_rehash在此目录中创建哈希别名。Apache需要这些。

为了测试一切是否存在,您可以执行以下操作:

 openssl s_client -CApath /path/to/ca/certificates -connect remoteserver:8443

如果连接成功,则会提示您可以在其中键入请求。尝试一下。

 GET /

看看你有没有得到。如果此测试成功,则apache也应该起作用。

现在,您可以添加ReWriteRule或Proxy语句以将连接转发到https服务器。


我真的是新来的..我怎样才能仅将Apache用于ssl并仅通过http进行重定向?
SaifDeen 2013年

听起来更容易..我只想在前端使用ssl ...
SaifDeen

如果您只想将apache用作Tomcat的ssl前端,您要做的就是在tomcat服务器上配置一个http或ajp连接器,并让apache将请求转发给它。
克里斯特·范·贝辛

我星期一试试吧!
SaifDeen 2013年
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.