在 tomcat 前使用 apache 設置 SSL
我正在嘗試使用 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" />
當代理 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 伺服器。