Konfiguracja SSL z apache przed tomcat

9

Próbuję skonfigurować Apache z żądaniami SSl i proxy SSL do mojej instancji tomcat. Myślę, że sprawiłem, że SSL działa, ale nadal pojawia się błąd:

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>
~               

Przekierowanie HTTP VH na 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>

Złącze Apache Tomcats

    <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
źródło
Czy serwer tomcat jest skonfigurowany z certyfikatem z podpisem własnym? Ponadto, jeśli używasz apache jako frontendu ssl dla tomcat, dlaczego używasz ssl również na serwerze tomcat? Najlepszą praktyką jest po prostu, aby twój tomcat odpowiadał na http i przesyłał https do serwera apache.
Krist van Besien

Odpowiedzi:

14

Podczas proxy http lub https do https musisz skonfigurować apache jako klienta ssl . Gdy apache komunikuje się z serwerem Tomcat, w końcu działa on jako klient WWW. Jednak Apache zwykle nie będzie działać jako klient SSL po wyjęciu z pudełka.

Po pierwsze, sugeruję, abyś najpierw rozważył, czy naprawdę tego potrzebujesz, dlaczego to robisz. Powszechną praktyką, gdy Tomcat i Apache mieszkają na tym samym serwerze, jest to, że Tomcat po prostu obsługuje zwykły http (lub ajp) i odciąża ssl na serwer Apache. Zwykle nie ma potrzeby posiadania ssl między serwerem Apache i Tomcat. Brak ssl na serwerze tomcat zaoszczędzi ci wielu problemów.

Wszystko, co musisz zrobić, to na przykład zdefiniować łącznik HTTP na porcie 8080 w instancji tomcat i przekierować tam wszystkie żądania z poziomu wirtualnego hosta SSL Apache:

<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>

Ale jeśli nadal decydujesz, że potrzebujesz proxy ssl do ssl, musisz dodać więcej zmian. Apache musi działać jako klient SSL, a także jako serwer SSL. Gdy Apache rozmawia z innym serwerem za pomocą protokołu https, w końcu przyjmuje rolę klienta. To nie jest takie proste i możesz napotkać wiele problemów. Musisz dodać to:

# 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.

Następnie na tej ścieżce musisz umieścić certyfikat CA używany do podpisania certyfikatu używanego przez serwer, z którym się komunikujesz. Jeśli używasz certyfikatu z podpisem własnym, musisz go umieścić w tym katalogu.

Gdy to zrobisz, musisz uruchomić „c_rehash” w tym katalogu. c_rehash jest częścią standardowej dystrybucji openssl. c_rehash tworzy skróty w tym katalogu. Apache potrzebuje tego.

Aby sprawdzić, czy wszystko tam jest, możesz wykonać następujące czynności:

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

jeśli połączenie się powiedzie, pojawi się monit, w którym możesz wpisać zapytanie. Po prostu spróbuj czegoś.

 GET /

i zobacz, czy coś otrzymasz. Jeśli ten test się powiedzie, apache powinien również działać.

Możesz teraz dodać ReWriteRule lub instrukcje proxy, aby przekazywać połączenia do serwera https.

Krist van Besien
źródło
jestem naprawdę nowy w tym .. jak mogę używać apache tylko dla ssl i przekierować tylko za pomocą http?
SaifDeen
brzmi dla mnie łatwiej .. Chcę tylko SSL dla interfejsu ...
SaifDeen
Jeśli chcesz po prostu używać apache jako frontendu ssl dla Tomcat, wystarczy skonfigurować łącznik http lub ajp na serwerze tomcat i mieć do niego żądania przesyłania apache.
Krist van Besien
źle wypróbuję to w poniedziałek!
SaifDeen