Information

  • Um ein Let's Encrypt-Zertifikat bei Tomcat zu hinterlegen, muss das Zertifikat in den Tomcat Keystore importiert werden.

Vorgehensweise

Manuell

Vorgehensweise

  • 1. Tomcat Service stoppen
  • 2. Let's Encrypt Zertifikat mittels certbot certonly --standalone -d [hostname] generieren/aktualisieren.
    • Hierzu muss der Server über das Internet erreichbar sein und die Ports 80 und 443 dürfen nicht belegt sein.
  • 3. In das Verzeichnis der neu erstellten Zertifikats-Dateien wechseln (Standard: /etc/letsencrypt/live/[hostname])
  • 4. Dort mit folgendem Befehl eine temporäre Keystore-File erstellen: openssl pkcs12 -export -in "fullchain.pem" -inkey "privkey.pem" -out "/tmp/keystorefile" -name tomcat -CAfile "chain.pem" -caname root -passout pass:changeit
  • 5. Den alten Tomcat-Keystore (Standard: /var/lib/tomcat/cert/[hostname].pkcs12) löschen.
  • 6. In das Verzeichnis der neu erstellten Keystore-File wechseln.
  • 7. Dort mit dem folgenden Befehl diese in den Tomcat-Keystore importieren: keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore "/var/lib/tomcat/cert/[hostname].pkcs12" -srckeystore "/tmp/keystorefile" -srcstoretype PKCS12 -srcstorepass changeit -alias tomcat

Gegebenenfalls muss die Konfigurationsdatei /usr/share/tomcat/conf/server.xml angepasst werden, sodass auf die richtige keystorefile verwiesen wird:

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
                  maxThreads="150" SSLEnabled="true"
                  scheme="https" secure="true"
                  SSLProtocol="TLSv1.2"
                  keystoreFile="/var/lib/tomcat/cert/[hostname].pkcs12" keystorePass="changeit"
                  clientAuth="false"
                  />
CODE
  • 8. Temporäre Keystore-File löschen
  • 9. Tomcat Service starten

Automatisch

Ein Bash Script hierfür sieht zum Beispiel so aus:

#!/usr/bin/env bash

set -o nounset

# Verzeichnis der Let's Encrypt Zertifikate
DIR=/path/to/cert-files
# Verzeichnis zum Zwischenspeichern der Keystore-File
TEMPDIR=/tmp
# Verzeichnis des Tomcat Keystores
KEY=/path/to/tomcat-keystore
# Log File
LOG=renew.log
# Zusätzliches Log File mit der Ausgabe vom certbot
TEMP_LOG=temp_renew.log

{
    echo "----------------------------------$(date)----------------------------------"
    
    echo "Stopping Tomcat.."
    systemctl stop tomcat.service
    
    echo "Renewing Certificates.."
    certbot certonly -n --standalone -d [hostname] |&amp; tee "${TEMP_LOG}"
    
    if grep -q Congratulations "${TEMP_LOG}"; then
    
        echo "Changing Directory to ${DIR}"
        pushd "${DIR}" &gt; /dev/null
            echo "Creating new Keystore.."
            openssl pkcs12 -export -in "fullchain.pem" -inkey "privkey.pem" -out "${TEMPDIR}/keystorefile" -name tomcat -CAfile "chain.pem" -caname root -passout pass:changeit
        popd &gt; /dev/null
        
        if [ -f "${KEY}" ]; then
            echo "Keystore ${KEY} already exists. Deleting.."
            rm "${KEY}"
        fi
        
        echo "Changing Directory to ${TEMPDIR}"
        pushd "${TEMPDIR}" &gt; /dev/null
            echo "Importing new Keystore into Tomcat.."
            keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore "${KEY}" -srckeystore "${TEMPDIR}/keystorefile" -srcstoretype PKCS12 -srcstorepass changeit -alias tomcat
        popd &gt; /dev/null
        
        echo "Cleanup.."
        rm "${TEMPDIR}/keystorefile"
        
    fi
    
    echo "Starting Tomcat.."
    systemctl start tomcat.service
    
    echo "----------------------------------$(date)----------------------------------"
    
} |&amp; tee -a "${LOG}"
BASH