Kategorien
Tutorials

Tomcat Self Signed Zertifikat einrichten

Unter Tomcat ist es recht einfach ein selbstsigniertes (Self Signed) Zertifikat einzurichten. Diese Anleitung zeigt die nötigen Schritte um ein Self Signed Zertifikat zu erstellen, in Tomcat einzubinden und HTTP-Anfragen automatisch auf HTTPS umzuleiten.

Getestet wurde dieser Artikel unter Windows mit Tomcat 8.5.20 und Java JRE 1.8.0_144-b01.

Mittlerweile verlangen viele Browser, dass man ein sog. SAN-Zertifikat erstellt, da sonst selbst bei eigentlich gültigen Zertifikaten ein Zertifikatsfehler angezeigt wird. Einen entsprechenden Artikel über SAN-Zertifikate und wie sich SAN-Zertifikate erstellen lassen, hat Oguz hier beschrieben. An der Einbindung im Tomcat ändert sich dadurch aber nichts.

Keystore und Zertifikat erstellen

Der Keystore und das Zertifikat werden mit dem Java-Kommandozeilentool keytool erzeugt. Dafür ist eine Eingabeaufforderung zu öffnen und in das Verzeichnis bin innerhalb des Installationsverzeichnisses von Java zu wechseln. Bei mir ist es beispielsweise C:\Program Files (x86)\Java\jre1.8.0_144\bin.

Mit folgendem Befehl lässt sich dann der Keystore samt Zertifikat erstellen:

keytool -genkey -keystore C:\Tomcat\ssl\.keystore -alias localhost -keyalg RSA -keysize 4096 -validity 365

Der Parameter alias dient seitens Java nur zur Identifizierung des Zertifikats innerhalb des Keystores, da ein Keystore durchaus mehrere Zertifikate enthalten kann. Schließlich wird noch die Schlüssellänge und die Gültigkeit des Zertifikats in Tage angegeben. Nachdem der Befehl abgeschickt wurde, werden mehrere Fragen gestellt, von denen die meisten nicht zwingend beantwortet werden müssen. Die zweite Frage nach dem Vor- und Nachnamen sollte jedoch mit der Domain, die durch das Zertifikat geschützt werden soll, beantwortet werden, da hiermit eigentlich der Common Name (CN) gemeint ist.

Tomcat Self Signed Zertifikat erstellen
Wer kein Self Signed Zertifikat erstellen möchte, kann auch ein offizielles Zertifikat erstellen. Dafür sind dann vier Schritte notwendig: Keystore erstellen, CSR erstellen, Zertifikat ausstellen und Zertifikat in Keystore importieren. Wie das genau funktioniert ist hier erklärt.

Tomcat konfigurieren

Nachdem Keystore und Zertifikat erzeugt sind, ist die Datei server.xml aus dem conf-Verzeichnis des Tomcat zu bearbeiten. Folgender Connector ist hinzuzufügen:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keyAlias="localhost" keystoreFile="C:\Tomcat\ssl\.keystore"
    keystorePass="password" />

Der Alias, der Pfad zu dem Keystore und das Keystore-Passwort sind natürlich entsprechend anzupassen.

Tomcat Self Signed Zertifikat installieren

Nach einem Neustart des Tomcat ist die Seite per HTTPS über https://localhost:8443 (natürlich nach einem Zertifikatsfehler, da das Zertifikat selbstsigniert ist) zu erreichen:

Veraltete Protokolle abschalten

Standardmäßig können immer noch Verbindungen über alte Protokolle wie TLS 1.0 oder TLS 1.1 aufgebaut werden. Es empfiehlt sich nur noch Verbindungen über die aktuellen Protokolle TLS 1.2 und TLS 1.3 zu erlauben. Dafür ist dem Connector folgender Parameter hinzuzufügen:

sslEnabledProtocols="TLSv1.2+TLSv1.3"

Der gesamte Connector sieht schließlich wie folgt aus:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
	sslEnabledProtocols="TLSv1.2+TLSv1.3"
    keyAlias="localhost" keystoreFile="C:\Tomcat\ssl\.keystore"
    keystorePass="password" />

Automatisch HTTP zu HTTPS umleiten

Sollte HTTPS erzwungen werden, lässt sich dies mit einer kleinen weiteren Anpassung in der Datei web.xml aus dem conf-Verzeichnis des Tomcat erledigen. Dazu muss einfach folgender Block vor dem schließenden web-app Tag </web-app> eingefügt werden:

<security-constraint>
 <web-resource-collection>
 <web-resource-name>Protected Context</web-resource-name>
 <url-pattern>/*</url-pattern>
 </web-resource-collection>
 <!-- Der auth-constraint ist hier einzufügen, falls eine Authentifizierung verwendet werden soll.
 Siehe Tutorial "Tomcat Passwortschutz für Webapplikationen"
 -->
 <user-data-constraint>
 <transport-guarantee>CONFIDENTIAL</transport-guarantee>
 </user-data-constraint>
</security-constraint>
Hier geht es zur Anleitung "Tomcat Passwortschutz für Webapplikationen":
https://nocksoft.de/tutorials/tomcat-passwortschutz-fuer-webapplikationen/

Auch hier ist der Tomcat natürlich wieder neuzustarten.

Wenn der Port für HTTPS geändert werden soll, muss der Port fortan an zwei Stellen in der Datei server.xml geändert werden:

Tomcat HTTPS Redirect

Update 02.09.2020

Unter manchen Konstellationen oder mit manchen Webapplikationen funktioniert die oben beschriebene Konfiguration in der Datei web.xml für die automatische Weiterleitung nicht. In diesem Fall ist alternativ folgendes Vorgehen zu verwenden:

In der Datei server.xml muss innerhalb des Blockes <Host name="localhost"... folgender Eintrag ergänzt werden:

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
Tomcat HTTPS Redirect

Im Verzeichnis conf\Catalina\localhost ist schließlich eine Datei "rewrite.config" mit folgendem Inhalt zu erstellen:

RewriteCond %{HTTPS} =off
RewriteRule ^(.*) https://%{HTTP_HOST}:443$1 [R=301]

Nach einem Tomcat-Neustart sollte die neue alternative Weiterleitungskonfiguration nun funktionieren.


Weiterführende Links
https://ssl-trust.com/csr-erstellen/tomcat
https://ssl-trust.com/ssl-zertifikat-installieren/tomcat

Quellen
https://coolestguidesontheplanet.com/redirecting-http-https-tomcat/
https://gist.github.com/jtgasper3/10501274

Seit mehreren Jahren begeistere ich mich privat und beruflich für die IT. Das habe ich dann auch zum Anlass genommen, diesen Blog ins Leben zu rufen, um dort praxisnahe Tutorials über verschiedene IT-Themen zu schreiben und meine selbst geschriebene Software zu veröffentlichen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert