Настройка SSL с Apache перед Tomcat

9

Я пытаюсь настроить Apache с SSl и прокси SSL-запросов к моему экземпляру Tomcat. Я думаю, что я сделал работу SSL, но все еще появляется ошибка, которая появляется:

Bad Gateway

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

* SSL Virtualhost *

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"
/>
SaifDeen
источник
Сервер Tomcat настроен с самозаверяющим сертификатом? Кроме того, если вы используете apache как интерфейс ssl для tomcat, почему вы также используете ssl на сервере tomcat? Лучше всего, чтобы ваш tomcat отвечал на http и выгружал https на сервер apache.
Крист ван Безьен

Ответы:

14

При проксировании http или https на https вам необходимо настроить apache в качестве клиента ssl . Когда apache общается с вашим сервером Tomcat, он все-таки работает как веб-клиент. Однако Apache обычно не работает как клиент SSL из коробки.

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

Крист ван Безен
источник
я действительно новичок в этом .. как я могу использовать apache только для ssl и перенаправить только с http?
SaifDeen
звучит для меня проще .. я просто хочу ssl для переднего конца ...
SaifDeen
Если вы просто хотите использовать apache в качестве ssl-интерфейса для Tomcat, все, что вам нужно сделать, - это настроить коннектор http или ajp на сервере tomcat и получить от него запросы перенаправления apache.
Крист ван Безен
Я попробую это в понедельник!
SaifDeen