Let's encrypt mit Hosteurope Webpack nutzen

Da hosteurope leider bisher nicht let's encrypt für die webpack- oder andere managed Pakete in automatisierter Form anbietet, muss man sich mit einem manuellen Erstellen des account-keys sowie dem Zertifikat behelfen. Wie das geht, was dabei zu beachten ist und wie man das zumindest zum Teil automatisieren kann, findet sich in diesem Artikel.

Verwendung des let's encrypt certbot tools

Als erstes benötigt man certbot (certbot-auto) oder eine andere Alternative für den acme-Client. Eine Anleitung findet sich bei let's encrypt.

Der Einfachheit halber habe ich mit dem python-tool certbot begonnen. Es ist leider etwas schwierig, alle Parameter irgendwo dokumentiert zu finden, weshalb sich ein initiales Ausführen des certbot-auto clients empfiehlt um die Abhängigkeiten aufzulösen.

Oder man führt das script get-certificate aus, das ich für die Automatisierung geschrieben habe. Mein Workflow ist wie folgt:

  1. Ich möchte das let's encrpyt Zertifikat mit 4096 Bit anstatt der voreingestellten 2048 erstellen.
  2. Da ich mehrere Domains auf dem webpack laufen habe, möchte ich die auch alle im Zertifikat einbinden.
  3. Standardmäßig speichert das certbot script die erzeugten Keys, Zertifikate und sonstige dazugehörigen (Meta-)Dateien in einer eigenen Folderstruktur unter '/etc/letsencrypt/'. Das macht auch für den Einsatz auf dem Produktivserver durchaus Sinn, weniger aber, wenn es ein lokales setup ist, auf dem das Zertifikat nicht deployt werden soll. Daher hätte ich die erzeugten Dateien gerne an einem Ort meiner Wahl.
  4. Reiner text modus anstatt ncurses erscheint mir für solch ein script besser geeignet.
  5. Alles, was sich ohne Interaktion machen lässt, soll auch genutzt werden.

Bis auf Punkt 3 lässt sich das schön über ein config file umsetzen, dass über den parameter --config pfad/zur/config.ini eingebunden wird. Theoretisch gibt es auch Parameter, um zumindest die Zielpfade für die Zertifikate anpassen lassen: --cert-path pfad/zu/cert.pem, --chain-path pfad/zu/chain.pem, --fullchain-path pfad/zu/fullchain.pem. Leider funktionieren die aber nur in Verbindung mit dem Parameter --csr, der es ermöglicht, einen selbst erstellten account-key sowie eine selbst erstellte Certificate Signing Request zu verwenden. Das ist leider nicht ganz eindeutig ersichtlich, weshalb ich es ausprobiert habe und mit einem timeout bei der Verifizierung gescheitert bin. Das gibt wiederum wenig Hinweise auf die eigentliche Ursache, lag dann aber irgendwie nahe.

Das let's encrypt Configfile

Punkt 1, 2, 4 und 5 lassen sich über ein .ini config file erledigen.

Die folgenden Parameter MÜSSEN geändert werden, damit das Erstellen des let's encrypt Zertifikats für Hosteurope korrekt funktioniert:

  1. email: Muss eine E-Mail-Adresse unter Kontrolle des Skriptausführenden sein
  2. domains: Muss eine oder mehrere (Komma-separierte) Domains unter der Kontrolle des Skriptausführenden sein

Für meinen Workflow MUSS die INI-Datei in ein (zu erstellendes) Verzeichnis im Skriptroot (also parallel zum Skript) kopiert, angepasst und 'acme.ini' genannt werden. Das Verzeichnis MUSS exakt mit dem Namen der ersten Domain aus der domains-Liste der Konfiguration übereinstimmen.

Über rsa-key-size kann die Bitgröße des RSA-Keys bestimmt werden.

Um automatisch die AGB zu bestätigen (tut man es nicht, bricht das Skript ab), kann agree-tos verwendet werden.

Nicht unbedingt notwendig für den manual-mode, sofern man das Skript händisch ausführt, ist die Option keep, die bestimmt, dass der Key nicht automatisch überschrieben wird, sofern er noch gültig ist.

Setzt man text auf True, wird statt ncurses der simple text-mode genutzt.

Außerdem kann über preferred-challenges die bevorzugte Verifizierungsart gewählt werden (dns oder http).

Eine weitere zwingende Bestätigung muss für das Loggen der IP-Adresse getätigt werden, was über die Option manual-public-ip-logging-ok (ohne Parameter) umgesetzt werden kann.

Die verwendeten let's encrypt Parameter

Wichtig für die manuelle Erstellung des Zertifikats sind folgende Parameter:

  • certonly: Sorgt dafür, dass nur das Zertifikat erstellt wird, führt aber kein deployment und config update
  • -a manual: Legt den manuellen Modus fest
  • --config pfad/zu/acme.ini: Legt den Pfad zum Config-File (siehe oben) fest
  • --logs-dir pfad/zu/logverzeichnis: Optional, wenn man den Logpfad in einem bestimmtem Verzeichnis haben möchte

Erstellen und Validieren des let's encrypt Zertifikats

Hier darf man Unter Umständen Datei-Disc-Jokey spielen... Je nach Menge der Domains müssen einige Verzeichniss und Dateien im .well-known/acme-challenge-Verzeichnis auf dem Zielserver (FTP) erstellt werden. Das nimmt bei mehreren Domains einige Zeit in Anspruch und ist leider redundant. Eine Automatisierung wäre hier leider etwas komplizierter und wohl am einfachsten über eine Anpassung des certbot-Skripts möglich.

Einbinden bei Hosteurope

Mittlerweile ist es sogar möglich, für jede (Sub-)Domain ein eigenes Zertifikat zu hinterlegen. Als ich mit meiner Konfiguration begonnen hatte, gab es die Möglichkeit noch nicht.

Im Hosteurope KIS 'Webhosting', 'konfigurieren', 'Sicherheit & SSL/SSL administrieren' wählen, dort das globale Zertifikat setzen.

Als nächstes müssen der Key (privkey.pem) als auch das Zertifikat (cert.pem) hochgeladen werden. Optional kann auch noch das let's encrypt intermediate Zertifikat hochgeladen werden (intermediate.pem). Eine genaue Anleitung gibt es auch bei hosteurope.

Nach dem Upload sollte es relativ schnell gehen und die domains sind mit SSL erreichbar.

Renew nach 90 Tagen (oder früher)

Da der manual mode verwendet wird und damit kein automatisches Erneuern des Zertifikats möglich ist, kann der 'renew'-Parameter des certbot scripts leider nicht verwendet werden. Hier muss genau der gleiche Ablauf wie oben beschrieben durchgeführt werden, also:

  1. Ausführen des scripts mit den verwendeten Parametern
  2. Validieren der einzelnen (Sub-)Domains mit Hilfe der .well-known-files
  3. Nach erfolgreicher Validierung Upload bei Hosteurope
let'sencryptcertbotssltlshosteuropewebpackautomate
February 18, 2017
Benedikt