Let's Encrypt mit acme.sh und Bash - automatisiert für SF6.x
So, mittlerweile habe ich es geschafft, automatisicert Let's Encrypt Zertifikate für meine SF zu bekommen.... ok, ich habe erst heute auf SF6 umgestellt.... aber dennoch funktioniert es.
Voraussetzungen
Ich benötige dazu:
- acme.sh Client
- DNS API
- Bash
acme.sh Client / DNS API
Der offizielle LE Client war mir immer zu vollgeladen mit Tonnen von Python Abhängigkeiten. Ich habe dann den acme.sh Client kennengelenrt, welcher ein reines Shell Script ist (nicht einmal Bash, sondern Shell allgemein um grösstmögliche Kompatibilität zu gewähren). Das kam mir natürlich sehr entgegen, zumal der acme.sh Client auch noch das DNS-01 Challenge unterstützt. Wenn man also einen DNS Provider mit API hat, kann man sich mittles DNS-Einträgen Certs austellen lassen, ohne dass man auf dem jeweiligen Rechner etwas bewerkstelligen muss. Das ist natürlich von Vorteil, wenn bereits ein Webserver läuft, den man nicht ohne Weiteres benutzen kann oder wenn man Certs austellen will für Rechner, die nur im LAN erreichbar sind etc.
Da ich ISPConfig benutze, habe ich Zugriff zu einer API gehabt (ab v.3.1 eine REST API) und so habe ich mir entsprechendes API Plugin geschrieben for acme.sh, welches inzwischen auch eingebunden ist. Somit ist das für mich also perfekt geeignet.
Den acme.sh Client kann man sich hier besorgen: https://github.com/Neilpang/acme.sh
WICHTIG: Anstelle des acme.sh Clients kann natürlich auch ein anderer Client verwendet werden. Dann müsste jedoch das Script an die Dateinamen etc. angepasst werden.
DNS API
Die ist an sich nur wichtig, wenn man nicht auf andere Weise sich die Certs generieren kann. Der acme.sh Client unterstützt DNS-01 Challenge und von dem her kann man sich das noch dazu basteln, wenn der eigene DNS Provider eine API zur Verfügung stellt. Hier ist eine Liste von DNS Provider resp. Control Panels, welche bereits von acme.sh unterstützt werden: https://github.com/Neilpang/acme.sh/tree/master/dnsapi
In meinem Fall habe ich also folgendes benutzt, nachdem ich acme.sh installiert hatte, die entsprechend anpassen:
export ISPC_User="xxx"
export ISPC_Password="xxx"
export ISPC_Api="https://ispc.domain.tld:8080/remote/json.php"
export ISPC_Api_Insecure=1
acme.sh --issue --dns dns_ispconfig -d voip.domain.tld -d vpn-voip.domain.tld
Bash
Das nachfolgende Script habe ich unter Bash verfasst. Da dies standardmässig installiert ist, muss nichts weiteres gemacht werden auf SF6.
Das Script
#!/usr/bin/env bash
domain="voip.domain.tld"
base="/root/.acme.sh/${domain}"
#-----------------------------------------------------------------------------#
# #
# BELOW BE DRAGONS #
# #
#-----------------------------------------------------------------------------#
p12="/tmp/sfcert.p12"
keystore="/tmp/tomcat.keystore"
web="/usr/share/tomcat6/ssl/"
pass="changeit"
# Create P12 file
openssl pkcs12 -export -out ${p12} -inkey ${base}/${domain}.key -in ${base}/${domain}.cer -CAfile ${base}/fullchain.cer -caname root -name tomcat -password pass:${pass}
# Create tomcat keystore
keytool -importkeystore -deststorepass ${pass} -destkeypass ${pass} -destkeystore ${keystore} -srckeystore ${p12} -srcstoretype PKCS12 -srcstorepass ${pass} -alias tomcat
# Replace orignal keystore with newly created one
if [[ -f '${keystore}' ]]; then
# Force move existing keystore
mv -f "${web}/tomcat.keystore" "${web}/tomcat.keystore.orig"
# Move newly created keystore into proper location
mv "${keystore}" "${web}/"
# Remove P12 file
rm "${p12}"
# Restart tomcat
/etc/init.d/tomcat6 restart
fi
Alles anzeigen
Das Script ist eigentlich relativ kurz. Wie gesagt, die Einstellung sind auf acme.sh getrimmt. Zuoberst die beiden Variablen anpassen. Also welche Domain verwendet worden ist und wo sich acme.sh befindet. Die restlichen Variablen können so belassen werden.
Danach wird zuerst die P12 Datei mit dem Passwort "changeit" kreiert. Diese P12 Datei wird mit dem Keytool in einen entsprechenden Keystore umgewandelt. Schlussendlich überprüft das Script, ob der neue Keystore tatsächlich kreiert worden ist, falls ja, wird der bisherige Keystore umbenannt und der neu generierte Keystore wird an die entsprechende Stelle verschogen. Zulest wird noch die P12 Datei gelöscht und dann Tomcat neu gestartet.
Soweit mir bekannt ist, dass das Passwort "changeit" nicht geändert werden, weil Tomcat in der Config Datei das Passwort benötigt um den Keystore zu öffnen. Ich habs aber nicht ausprobiert.
Das Let's Encrypt Cert mittels Script und acme.sh installieren
Nachdem wir nun ein LE Cert haben, das Script heruntergeladen, angepasst und ausführbar gemacht haben, fehlt nun noch der letzte Schritt: acme.sh mitzuteilen, wie er die LE Certs zu installieren hat. Dies geht einfach mit folgendem Befehl:
That's It
Damit sollte das nun automatisiert laufen. Einfach in 60 Tagen mal wieder reinschauen, ob es aktulisiert hat. Wieso nach 60 Tagen? Weil acme.sh die Zertifikate nach 60 Tagen versucht zu erneuern