How-To – Let’s Encrypt und Tomcat

Wie installiert man Let’s Encrypt in Verbindung mit Tomcat? Let's Encrypt und TomcatWir haben vor kurzem unser Projekt LokaleWare aus Performance- und Erweiterungsgründen auf einen neuen Server migriert. Nun wollten wir auch dort, dass LokaleWare mittels HTTPs gesichert ist. Deshalb wollten wir auch dort Let’s Encrypt einsetzen um die Zertifikate zu generieren. Das Problem ist, dass wir keine gute Anleitung bezüglich der Kombination mit Tomcat gefunden haben und so viele Forenbeiträge durchsuchen mussten. Deshalb werden wir hier unsere Lösung beschreiben. We call it; Let’s Encat 😀

Voraussetzungen

Umgesetzt haben wir das Projekt mit folgenden Versionen:
letsencrypt 0.4.1
tomcat 7

Umsetzung Let’s Encrypt und Tomcat

Das Programm letsencrypt kann je nach Installation auch certbot oder letsencrypt-auto heißen.

Im Vergleich zum Apache gibt es bei der Zertifikatserstellung mit Tomcat zwei Probleme. Das erste Problem ist, dass der Beweis, dass diese Domain zu dem Server gehört über Port 80 und dem richtigen Pfad bereitgestellt werden muss. Wir wollten unsere Projekte von externen Scripten unberührt lassen, weshalb wir die Beweis-Datei nicht mittels Tomcat auslieferen. Deshalb kommen wir nun zu der von uns gewählten Lösung. Wir lassen für kurze Zeit einen anderen HTTP Server die Datei bereitstellen. Dazu beenden wir Tomcat, damit Port 80 frei wird und starten den neuen Server.

Das nächste Problem war die Umwandlung des Zertifikates und die Speicherung in den Java-Keystore (JKS). Zur Umwandlung verwenden wir OpenSSL um anschließend das neue Format des Zertifikates im JKS zu speichern.

Zum Schluss muss nur noch der Tomcat wieder gestartet werden.

Hier unser Shell-Script:
#!/bin/bash
# preparation
certdir=/etc/letsencrypt/live/lokaleware.de
keytooldir=/opt/java/default/jre/bin/
mydomain=lokaleware.de
myemail=info@lokaleware.de
keystoredir=/opt/tomcat7/lw.jks

#the script itself:
service tomcat7 stop

letsencrypt certonly --standalone -d www.$mydomain -d $mydomain --standalone-supported-challenges http-01 --http-01-port 80 --renew-by-default --email $myemail --agree-tos

$keytooldir/keytool -delete -alias root -storepass changeit -keystore $keystoredir
$keytooldir/keytool -delete -alias tomcat -storepass changeit -keystore $keystoredir

openssl pkcs12 -export -in $certdir/fullchain.pem -inkey $certdir/privkey.pem -out $certdir/cert_and_key.p12 -name tomcat -CAfile $certdir/chain.pem -caname root -password pass:aaa

$keytooldir/keytool -importkeystore -srcstorepass aaa -deststorepass changeit -destkeypass changeit -srckeystore $certdir/cert_and_key.p12 -srcstoretype PKCS12 -alias tomcat -keystore $keystoredir
$keytooldir/keytool -import -trustcacerts -alias root -deststorepass changeit -file $certdir/chain.pem -noprompt -keystore $keystoredir

# restart your tomcat server
service tomcat7 start

Weitere Konfigurationen

Zum Schluss erstellt Ihr noch einen Cron-Job und lasst kurz vor Ablauf der 3 Monate das Zertifikat erneuern.

In der Datei „server.xml“ müsst Ihr noch die Keystore-Datei auslesen, indem Ihr z.b. folgendes Connector-Tag verwendet:

<Connector
port="443"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
SSLEnabled="true"
maxThreads="150"
minSpareThreads="25"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="100"
scheme="https"
secure="true"
keystoreFile="/opt/tomcat7/lw.jks"
keystorePass="changeit"
clientAuth="false"
sslProtocol="TLS"
useBodyEncodingForURI="true" ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_SHA256, TLS_ECDHE_RSA_WITH_AES_128_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_SHA, TLS_ECDHE_RSA_WITH_AES_256_SHA384, TLS_ECDHE_ECDSA_WITH_AES_256_SHA384, TLS_ECDHE_RSA_WITH_AES_256_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_SHA, TLS_DHE_RSA_WITH_AES_128_SHA256, TLS_DHE_RSA_WITH_AES_128_SHA, TLS_DHE_DSS_WITH_AES_128_SHA256, TLS_DHE_RSA_WITH_AES_256_SHA256, TLS_DHE_DSS_WITH_AES_256_SHA, TLS_DHE_RSA_WITH_AES_256_SHA" />

Hinweis

Die Passwörter sind natürlich geändert und solltet Ihr das Script verwenden, solltet Ihr es auch ändern. Mehr Information über Let’s Encrypt hatten wir auch schonmal in einem alten Blogpost erwähnt.
Viel Erfolg beim Ausprobieren.