it-swarm.com.de

Apache VirtualHost mit Mod-Proxy und SSL

Ich versuche, einen Server mit mehreren Webanwendungen einzurichten, die alle über Apache VirtualHost bereitgestellt werden (Apache wird auf demselben Server ausgeführt). Meine Hauptbeschränkung besteht darin, dass jede Webanwendung eine SSL-Verschlüsselung verwenden muss. Nachdem ich eine Weile gegoogelt und mir andere Fragen zum Stackoverflow angesehen hatte, schrieb ich die folgende Konfiguration für den VirtualHost:

<VirtualHost 1.2.3.4:443>
    ServerName Host.example.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>

Obwohl https://Host.example.org:844 zugänglich ist, ist https://Host.example.org nicht verfügbar, was den Zweck meines virtuellen Hosts zunichte macht Aufbau. Firefox beschwert sich darüber, dass die Verbindung unterbrochen wurde, obwohl eine erfolgreiche Verbindung zum Server hergestellt wurde. Ich erhalte auch die folgende Warnung in Apaches error.log:

proxy: no HTTP 0.9 request (with no Host line) on incoming request and preserve Host set forcing hostname to be Host.example.org for uri 

In der Webanwendung (einem Tomcat-Server) zeigt das Zugriffsprotokoll eine seltsame Zugriffsanforderung:

"?O^A^C / HTTP/1.1" 302

Im Folgenden finden Sie die richtige Zugriffsanfrage, die ich erhalte, wenn ich mich direkt mit https://Host.example.org:844 verbinde:

"GET / HTTP/1.1" 302

Abschließend sollte ich noch erwähnen, dass der virtuelle Host einwandfrei funktioniert, wenn ich kein SSL verwende.

Wie kann ich das zum Laufen bringen?

28
JMD

Endlich habe ich einen Weg gefunden, es zum Laufen zu bringen. Zuerst habe ich den Vorschlag von Dave Cheney ausprobiert und ein anderes Zertifikat für den Apache-Server installiert, der auf den Tomcat-Nicht-SSL-Port umgeleitet wurde (der Proxy hat also auf http: // localhost: 8080 / umgeleitet). Leider hat es nicht vollständig funktioniert, da im Webbrowser das https sofort nach der Verbindung in http umgewandelt wurde. Also habe ich wieder https: // localhost: 8443 / verwendet und der letzte Schliff, damit es funktioniert, war das erneute Hinzufügen von SSLProxyEngine.

Hier ist die resultierende VirtualHost-Konfiguration:

<VirtualHost 1.2.3.4:443>
    ServerName Host.domain.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLEngine on
    SSLProxyEngine On
    SSLCertificateFile /etc/Apache2/ssl/certificate.crt
    SSLCertificateKeyFile /etc/Apache2/ssl/certificate.key

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>
35
JMD

Versuchen Sie diese Konfiguration

<VirtualHost 1.2.3.4:443>
    ServerName Host.domain.org

    SSLEngine On
    # include other ssl options, like cert and key here

    ProxyRequests Off
    ProxyPreserveHost On

    <Location />
        ProxyPass http://localhost:8443/
    </Location>
</VirtualHost>

Wenn Ihre Anwendung über die Proxy-Verbindung Zugriff auf die SSL-Informationen haben muss, sollten Sie mod_proxy_ajp und den Tomcat ajp1.3-Connector verwenden.

4
Dave Cheney

Wenn Sie jedoch mehrere SSL-fähige Webanwendungen auf demselben Server ausführen möchten. Wenn Sie Apache im Voraus hinzufügen, werden sie nicht mit der oben genannten Konfiguration ausgeglichen. Sie benötigen weiterhin einen Load Balancer, oder Sie können das Proxy Balancer-Modul von Apache mit folgenden Funktionen verwenden:

ProxyRequests Off

<Proxy balancer://someapplication>
    BalancerMember http://127.0.0.1:18443 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18444 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18445 keepalive=on max=2 retry=30
</Proxy>


<VirtualHost 1.2.3.4:443>
    SSLEngine on
    SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile //path/to/key.pem
    SSLVerifyClient optional

    RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
    RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

<Location />
    SetHandler balancer-manager
    Order allow,deny
    Allow from all
</Location>

ProxyPass / balancer://someapplication:443/
ProxyPassReverse / balancer://someapplication:443/
ProxyPreserveHost on
2
Brendan

Was ich hier nicht verstehe, ist, warum Sie eine SSL-Verbindung von Ihrem Apache zu Ihrer Anwendung benötigen, die sich auf demselben Computer zu befinden scheint ( http: // localhost: 8443 / ).

Ich denke, der übliche Weg, solche Dinge einzurichten, besteht darin, dass Apache SSL-Verschlüsselung für die "Kunden" -Seite bereitstellt, z. Internet und haben eine unverschlüsselte Verbindung zur Anwendung. Dies gibt Ihnen auch mehr Freiheit beim Debuggen Ihrer Anwendungsantworten.

Das andere, was Dave Cheney erwähnte, ist die Verwendung des nativen Tomcat-Connectors, um einen Lastausgleich und andere Funktionen zu erhalten.

1
zero_r

Müssen Sie wirklich einen Proxy für einen HTTPS-Dienst erstellen? Möglicherweise möchten Sie einen Proxy für den Nicht-SSL-Dienst in localhost erstellen, z.

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
0
codehead

Zuerst würde ich prüfen, ob Sie eine Anfrage von localhost an localhost: 8443 stellen können und ob dies erfolgreich ist (IE macht ein GET oder wget http: // localhost: 844 )

Ich bin mir nicht ganz sicher, warum Sie einen virtuellen Host haben, der Port 443 überwacht und ihn dann an einen anderen SSL-Host weiterleitet

warum kann die Anwendung 443 nicht nativ verwenden? Wenn Sie es nicht ändern können, können Sie einfach iptables verwenden, um den Port umzuleiten

0
Brendan

Überprüfen Sie Ihr SSL-Fehlerprotokoll und stellen Sie sicher, dass Sie keine Fehler haben, wenn Sie die CA-Zertifikatkette nicht überprüfen können.

0
Neobyte