Я пытаюсь настроить Apache с SSl и 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, он, в конце концов, работает как веб-клиент. Однако Apache обычно не работает как SSL-клиент из коробки.
Во-первых, я бы посоветовал вам сначала подумать, действительно ли вам это нужно, почему вы это делаете. Обычно, когда Tomcat и Apache находятся на одном сервере, Tomcat просто обслуживает простой http (или ajp) и выгружает ssl на сервер Apache. Обычно нет необходимости иметь ssl между сервером apache и tomcat. Отсутствие ssl на сервере tomcat избавит вас от многих проблем.
Все, что вам нужно сделать, это, например, определить HTTP-коннектор на порту 8080 в вашем экземпляре tomcat и перенаправить все запросы туда из вашего виртуального хоста 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-сервер.