Erklärtes Ziel war es, die Anwendungen unter der Domain athanassiou.me sicher über HTTPS bereitzustellen, und auf den Zusatz 8080 verzichten zu können.
Denn das tat bisher einfach nicht … aus gutem Grund. Irgendwie kam ich mit den selbst erworbenen Zertifikaten und der plesk installation nicht zurecht, egal was ich in die server.xml geschrieben habe.
Der Server wird bei STRATO betrieben und nutzt die dort vorinstallierte Plesk-Weboberfläche. Die Java-Webanwendungen laufen in einem Apache Tomcat auf Port
8080. Tomcat lief sauber auf Port 8080 mit HTTP, aber alle HTTPS-Zugriffe auf die Domain gingen zuerst an Plesk.
Der erste Ansatz, SSL „direkt“ im Tomcat einzurichten, scheiterte aus genau diesem Grund:
Port 443 war bereits durch den Plesk-eigenen nginx/Apache-Stack belegt. Tomcat konnte diesen Port weder übernehmen noch parallel nutzen.
Da plesk die Ports 80 und 443 vollständig belegt, war also eine direkte HTTPS-Nutzung von Tomcat nicht möglich.
Damit war klar, dass der Weg über plesk gehen muss. Inkusive der Zertifikate. Über den Menüpunkt "SSL/TLS Certificates" kann ein Let's-Encrypt-Zertifikat zugewiesen werden, das Plesk automatisch erneuert und in nginx/Apache einbindet. Anstelle einer SSL-Konfiguration direkt im Tomcat übernimmt nun Plesk vollständig die TLS-Terminierung. Zertifikate werden über die integrierte Let's-Encrypt-Unterstützung erzeugt und automatisch erneuert.Damit lassen sich automatisch gültige TLS-Zertifikate für die Domain erstellen, erneuern und verwalten – ganz ohne manuelle CSRs, KeyStores oder PKCS#12-Erzeugung.
Das Verfahren hat einige Vorteile:
Tomcat benötigt daher keine eigenen Zertifikate oder SSL-Connectoren. Das spart einem einiges an Gefuddel in der tomcat Konfiguration.
nginx fungiert als erste Instanz für HTTPS-Verbindungen, übernimmt TLS und leitet Anfragen an Apache weiter. Apache führt die Reverse-Proxy-Regeln aus und leitet Requests intern an Tomcat weiter. Tomcat selbst läuft ausschließlich als HTTP-Backend auf Port 8080.
Der entscheidende Schritt bestand darin, in den „Apache Additional Directives“ in Plesk (Websites & Domains → Apache & nginx Settings → Additional Apache directives ) folgendes Snippet zu hinterlegen:
<IfModule mod_proxy.c>
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</IfModule>
Damit wird jede Anfrage an die Domain über Apache zu Tomcat weitergeleitet. Tomcat erhält den korrekten
Hostnamen und weiß über den Header X-Forwarded-Proto: https, dass die ursprüngliche Verbindung
verschlüsselt war.
Die Anwendungen sind jetzt stabil und sicher unter:
https://athanassiou.mezu erreichen, und die Browser können sich die Passworte auch merken.
Im Ergebnis hat die Lösung jetzt folgende Eigenschaften:
Unter Plesk arbeitet nginx als vorgeschaltete Instanz vor Apache. Es übernimmt:
nginx selbst wird nicht für eigene Location-Blöcke genutzt, da diese von Plesk verwaltet werden. Der Reverse Proxy erfolgt ausschließlich in Apache, was im Plesk-Web Admin Edition der unterstützte Weg ist.