Frage Apache VirtualHost mit Mod-Proxy und SSL


Ich versuche, einen Server mit mehreren Webanwendungen einzurichten, die alle über Apache VirtualHost (Apache, das auf demselben Server ausgeführt wird) bereitgestellt werden. Meine Haupteinschränkung ist, dass jede Webanwendung die SSL-Verschlüsselung verwenden muss. Nachdem ich eine Weile gegoogelt und andere Fragen zu stackoverflow beantwortet habe, habe ich folgende Konfiguration für den VirtualHost geschrieben:

<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:8443 ist zugänglich, https://host.example.org ist nicht, was den Zweck meiner virtuellen Host-Konfiguration vereitelt. Firefox beklagt, dass die Verbindung trotz erfolgreicher Verbindung mit dem Server unterbrochen wurde. Ich bekomme 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 

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

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

Im Folgenden ist die korrekte Zugriffserwiderung, die ich bekomme, wenn ich mich direkt verbinde https://host.example.org:8443:

"GET / HTTP/1.1" 302

Schließlich sollte ich noch erwähnen, dass der virtuelle Host einwandfrei funktioniert, wenn ich kein SSL benutze.

Wie kann ich das schaffen?


24
2018-06-14 06:17


Ursprung




Antworten:


Endlich habe ich einen Weg gefunden, es zum Laufen zu bringen. Zuerst habe ich einen Vorschlag von Dave Cheney ausprobiert, also habe ich ein anderes Zertifikat für den Apache - Server installiert, der an den Tomcat - Nicht - SSL - Port umgeleitet wurde (also den Proxy zu http: // localhost: 8080 /). Leider funktionierte es nicht vollständig, da im Webbrowser das https sofort bei der Verbindung in http umgewandelt wurde. Also habe ich wieder benutzt https: // localhost: 8443 / und die letzte Berührung, um es zum Laufen zu bringen, war, SSLProxyEngine wieder hinzuzufügen.

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>

Danke für alle Hilfe :)


31
2018-06-14 14:25



Vermeiden ProxyPreserveHost On es ist fast immer falsch, nutzlos und fast immer kaputt ProxyPassReverse. Als Anmerkung ProxyRequests off ist der Standard, also redundant. - kubanczyk


Probieren Sie diese Konfiguration aus

<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 Zugriff auf die SSL-Informationen von der Proxyverbindung benötigt, sollten Sie mod_proxy_ajp und den Tomcat ajp1.3-Connector in Betracht ziehen.


4
2018-06-14 12:36





Wenn Sie jedoch mehrere SSL-fähige Webanwendungen auf demselben Server ausführen möchten. Hinzufügen von Apache im Vordergrund wird nicht balancieren sie mit Ihrer obigen Konfiguration, Sie würden immer noch benötigen ein Load Balancer oder Sie könnten Apache Proxy-Balancer-Modul mit etwas wie dem folgenden 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
2018-06-14 22:02



Momentan brauche ich keinen Lastausgleich, aber das könnte in Zukunft sehr hilfreich sein. Danke für die Einsicht. - JMD


Nun, was ich hier nicht verstehe ist, warum Sie eine SSL-Verbindung von Ihrem Apache zu Ihrer Anwendung haben müssen, die sich auf demselben Rechner befindet (http: // localhost: 8443 /).

Ich denke, der übliche Weg, um solche Dinge einzurichten, ist Apache, der SSL-Verschlüsselung für die "Kunden" -Seite, z. Internet und eine unverschlüsselte Verbindung zur Anwendung. Dies gibt Ihnen auch mehr Freiheit, Ihre Anwendungsantworten zu debuggen.

Die andere Sache, die Dave Cheney erwähnte, ist die Verwendung des nativen Tomcat-Connectors, um Load Balancing und andere Funktionen zu haben.


1
2018-06-14 13:33



Nun, ich habe zwei Gründe, ein solches Setup zu wählen. Der erste ist, dass der Tomcat-Server bereits in SSL läuft und ich dachte, es wäre einfach, Apache VirtualHost damit zu verwenden. Der zweite ist, dass der Anbieter der Anwendung (JIRA) einige Richtlinien für die Apache-Integration (atlassian.com/software/jira/docs/v3.13/apacheintegration.html) und ich gründete meine Konfiguration darauf, indem ich VirtualHost-Unterstützung hinzufügte. Ich nehme an, das war komplexer als ich dachte, abgesehen davon, dass es funktioniert, möchte ich wirklich verstehen, was das Problem ist. - JMD


Müssen Sie wirklich einen HTTPS-Dienst als Proxy verwenden? Möglicherweise möchten Sie den Dienst non-ssl in localhost, z.

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

0
2018-06-14 06:33



In der Tat ist die Verwendung von SSL für mich obligatorisch. Ich habe auch getestet, ohne SSL zu verwenden, nur um zu überprüfen, und es funktioniert gut. SSL-Unterstützung ist das eigentliche Problem. - JMD


Zuerst würde ich sehen, ob Sie eine Anfrage von localhost zu localhost: 8443 tun können und sehen, ob das erfolgreich ist (IE tun ein GET oder wget http: // localhost: 8443)

Ich bin nicht ganz sicher, warum ein virtueller Host auf Port 443 hört und ihn dann an einen anderen SSL-Host weiterleitet

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


0
2018-06-14 06:34



Der Grund ist, dass ich mehr Webanwendungen auf demselben Server installieren muss, die alle SSL verwenden und nicht alle Port 443 abhören können. Daher verwende ich IP-basierte VirtualHosts, damit jede Webanwendung auf ihrem eigenen Server gehostet wird. Ich habe den folgenden wget Befehl getestet und es funktioniert gut: wget localhost: 8443 - kein Scheckzertifikat - JMD
Hinweis - Es ist eine einfache Sache, Ihrem Server zusätzliche IP-Adressen hinzuzufügen und somit mehrere Anwendungen auf Port 443 abhören zu lassen - alle auf separaten IP-Adressen. - Brent


Überprüfen Sie Ihr SSL-Fehlerprotokoll, und stellen Sie sicher, dass keine Fehler auftreten, die CA-Zertifikatkette nicht zu überprüfen.


0
2018-06-14 09:40



Wenn es tatsächlich Überprüfungsfehler gibt, was wäre die Lösung? - Javier Méndez