Let's Encrypt - automatisiert für SF6

  • 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:

    Code
    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



    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:


    Code
    acme.sh --installcert -d voip.domain.tld --reloadcmd "/root/SCRIPTNAME.sh"


    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 ;)

    Einmal editiert, zuletzt von hyanak ()

  • Super danke!
    Da muss ich mich gleich mal in die Bastel-/Testecke setzen.


    Noch schöner wäre es, wenn STARFACE diese Funktionalität von Haus aus einbauen würde, wie dies einige Hostingprovider auch tun.

    Gruss
    Thomas


    hertli ¦ IT
    hertli Informatik+Treuhand


    eMail: mail ( a t ) hertli.ch
    Internet: www.hertli.ch


    Virtuelle Rechenzentren (IaaS, PaaS) mit Standorten in CH + DE, Managed Services, Security

  • Von Haus ist nicht unbedingt einfach, wenn SF z.B. hinter NAT sitzt und nicht als öffentlicher Server zugänglich ist. Dadurch scheitert dann das Challenge mittels HTTP/S. Bei Hostingprovider, wo generell ein Webserver läuft und der Server nicht hinter NAT ist, ist es natürlich viel einfacher mittels Webroot-Variante Zertifikate zu holen.


    Ich benutze ISPConfig und habe halt für acme.sh das ISPC-DNS Plugin geschrieben.


    Das DNS-01 Challenge ist deswegen interessant, weil man unabhängig vom Server (vor hinter NAT, mit od. ohne laufenden Webserver etc.) ein Zertifikat bekommt. Man muss lediglich einen TXT Eintrag in die Zone machen, diesen prüfen lassen und danach kann man ihn wieder entfernen.


    Die Kunst ist, wie man das Cert auf die SF bekommt. Der Rest ist dann relativ simpel, wie du dem Script entnehmen kannst. Mit OpenSSL eine P12 Datei erstellen. Die P12 Datei dann in den Keystore umwandeln. Keystore an den richtigen Ort kopieren und Tomcat neu starten.

    2 Mal editiert, zuletzt von hyanak ()

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!