Let’s Encrypt Zertifikate per Skript über FTP aktualisieren

Einige von Euch kennen das Problem vielleicht: Man hat einen Webserver, mit vielen VIELEN Domains drauf, welche ein SSL-Zertifikat von Letsencrypt erhalten sollen – aber diese muss man manuell erstellen, weil man auf dem Server keine Programme ausführen darf.

Zum Glück interessiert sich Certbot nicht dafür, wo der Server steht, solange er über einen lokalen Dateizugriff die Validierungsdateien schreiben kann. Und zum Glück kann man die meisten Webserver per FTP ins lokale Dateisystem von Linux einbinden. Und zum Glück habe ich ein paar Skripte zusammengeschrieben, welche das Euch möglichst einfach machen sollen!

Vorbereitungen

Wie gesagt benötigen wir Certbot und ein Tool zum Einbinden von FTP-Verbindungen ins lokale Dateisystem. Beides kann mit folgendem Befehl installiert werden:

sudo apt-get install certbot curlftpfs

Das war es im Prinzip auch schon mit den Vorbereitungen. Die folgenden Skripte decken zwei alltägliche Szenarien ab: Das Anlegen von neuen Zertifikaten und das Erneuern von bestehenden Zertifikaten.

Neue Zertifikate anlegen

Hierfür benötigen wir 5 Schritte: Zunächst wird die FTP-Verbindung aufgebaut, dann werden alle notwendigen Zertifikate über ein kleines Libreoffice-Calc-Sheet die Certbot-Befehle generiert und ausgeführt, anschließend die FTP-Verbindung wieder geschlossen und zuletzt noch die Zertifikate in für den Benutzer einfach verfügbaren Form bereit gestellt.

Skript zum Aufbauen einer FTP-Verbindung

#!/bin/bash

ftp_user="Benutzername für den FTP-Zugriff"
ftp_password="FTP-Passwort"
ftp_protocol="ftp"
ftp_server="FTP-Serveradresse"
ftp_mount="Lokaler Einhängepunkt für die FTP-Verbindung"
ftp_options="ssl_control,allow_other"

sudo mkdir -p "$ftp_mount"
sudo curlftpfs -o $ftp_options "$ftp_protocol://$ftp_user:$ftp_password@$ftp_server" "$ftp_mount"

Diese Datei habe ich bei mir als „mount-ftp.sh“ abgespeichert.

Generieren und Ausführen der Certbot-Befehle

Gerade wenn mehrere Domains mit einem einzelnen Zertifikat abgedeckt werden sollen (z.B. mit und ohne „www“ davor), hilft folgendes Calc-Sheet bei der Erstellung des Certbot-Befehls:

certbot-command-builder

Einfach in der Zelle A1 eintragen, wie der absolute Pfad zum Root-Ordner der jeweiligen Website (in Eurem lokalen Dateisystem) lautet, und in A2 und folgende die Domains eintragen, ggf. die Formel in der B-Spalte verlängern. Die letzte Zeile in Spalte B enthält dann die finale Formel.

Die so enstanden Befehle können im Linux-Terminal ausgeführt werden.

FTP-Verbindung wieder schließen

#!/bin/bash

ftp_mount="/mnt/ftp"

sudo fusermount -uz "$ftp_mount"
sudo rmdir "$ftp_mount"

Diese Datei heißt bei mir „umount-ftp.sh“ – und beendet einfach die FTP-Verbindung. Nothing more to say here.

Zertifikate bereitstellen

Wir haben nun die Zertifikate erstellt, diese liegen aber per Default im Verzeichnis „/etc/letsencrypt“, welches nur durch priviligierte Benutzer zugänglich ist. Folgendes Skript kopiert die Zertifikatsdateien und ändert die Berechtigungen so, dass sie von einem bestimmten Benutzer einfach gelesen und weiterverarbeitet werden können.

#!/bin/bash

certs_path="/Pfad/zum/Zielordner"
certs_path_user="Benutzername:Gruppenname"

sudo rm -rf "$certs_path"
sudo mkdir -p "$certs_path"
sudo cp -Lr "/etc/letsencrypt/live/." "$certs_path"
sudo chown -R "$certs_path_user" "$certs_path"

Passt das Skript unbedingt an! Es löscht ggf. vorhandene alte Zertifikate im Zielordner (und wenn Ihr dort / angebt, eben Euer Betriebssytem). Benutzername und Gruppenname sind im Regelfall identisch.

Die Zertifikate liegen dann im Zielordner in Unterverzeichnisssen vor, welche jeweils nach der ersten Domain (und ggf. einer Ziffer) der Certbot-Befehls benannt sind. Im Ordner befinden sich dann 4 Dateien:

  • cert.pem – Diese enthält das öffentliche Zertifikat
  • privkey.pem – Diese enthält das geheime Zertifikat
  • chain.pem – Diese enthält den ggf. notwendigen Vertrauenschritt für Endgeräte, damit sie cert.pem als gültig anerkennen. Diese Datei ist über alle Zertifikate hinweg identisch.
  • fullchain.pem – Diese Datei enthält cert.pem und chain.pem in einer Datei – manche Tools können damit umgehen, manche nicht.

Wie die jeweiligen Zertifikate beim Anbieter Eures Vertrauens eingebunden werden müssen, müsst Ihr selber schauen. Bei meinem betreffenden Anbieter musste ich die Zertifikate per Copy&Paste in Textfelder reinkopieren.

Zertifikate erneuern

Nachdem Ihr die Zertifikate nun erstellt habt, müssen diese alle 2-3 Monate erneuert werden. Der Vorgang des Erneuerns ist zum Glück deutlich simpler, da hier nur ein Skript notwendig ist (die Zertifikate müssen aber wahrscheinlich immer noch manuell in das System Eures Anbieters kopiert werden).

#!/bin/bash

ftp_user="Benutzername für den FTP-Zugriff"
ftp_password="FTP-Passwort"
ftp_protocol="ftp"
ftp_server="FTP-Serveradresse"
ftp_mount="Lokaler Einhängepunkt für die FTP-Verbindung"
ftp_options="ssl_control,allow_other"
certs_path="/Pfad/zum/Zielordner"
certs_path_user="Benutzername:Gruppenname"

echo "Baue FTP-Verbindung auf..."
sudo mkdir -p "$ftp_mount"
sudo curlftpfs -o $ftp_options "$ftp_protocol://$ftp_user:$ftp_password@$ftp_server" "$ftp_mount"
echo "Fertig!"
echo ""

echo "Erstelle und validiere Zertifikate..."
sudo certbot renew
echo "Fertig!"
echo ""

echo "Beende FTP-Verbindung..."
sudo fusermount -uz "$ftp_mount"
sudo rmdir "$ftp_mount"
echo "Fertig!"
echo ""

echo "Kopiere Zertifikate ins Benutzerverzeichnis..."
sudo rm -rf "$certs_path"
sudo mkdir -p "$certs_path"
sudo cp -Lr "/etc/letsencrypt/live/." "$certs_path"
sudo chown -R "$certs_path_user" "$certs_path"
echo "Fertig!"
echo ""

echo "Die Zertifikate müssen noch in den Webserver eingebungen werden."
echo ""

Beachtet bitte, dass die Einstellungen beim Erstellen der Zertifikate auch hier verwendet werden. Certbot merkt sich z.B. den Pfad zum Webroot.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert