DecaTec

Programmieren, Fotografie, Home-Server und einiges mehr

Let’s Encrypt Zertifikate per Cron automatisch erneuern

Let's Encrypt Logo

In meinen Tutorials zu Nextcloud/ownCloud verweise ich ja gerne auf SSL-Zertifikate von Let’s Encrypt. Mit dieser Zertifizierungsstelle können auf einfache Weise TLS-/SSL-Zertifikate erzeugt werden. Auch wenn im privaten Umfeld ein sog. selbst signiertes Zertifikat ausreichen würde, bieten Zertifikate von Let’s Encrypt einen entscheidenden Vorteil: Es handelt sich hierbei um „trusted“ Zertifikate, d.h. dass alle gängigen Browser/Clients stufen diese als vertrauenswürdig ein.

Auch wenn die Erzeugung eines Zertifikats über Let’s Encrypt einfach und schnell von der Hand geht, wird als Kritikpunkt häufig die begrenzte Gültigkeitsdauer aufgeführt: Diese Zertifikate sind aus Sicherheitsgründen nur für einen Zeitraum von 90 Tagen gültig und müssen danach neu generiert werden.

Der folgende Artikel zeigt eine einfache Möglichkeit, wie die Erneuerung von Let’s Encrypt Zertifikaten ganz einfach automatisiert per Cron durchgeführt werden kann.

Warum kein selbst signiertes Zertifikat verwenden?

Selbst signierte Zertifikate haben zwei entscheidende Vorteile:

  • Kostenlos, da die Zertifikat-Dateien selbst erzeugt werden können, z.B. mittels OpenSSL (Zertifizierungsstellen lassen sich ihre Dienste immer fürstlich bezahlen).
  • Den Gültigkeitszeitraum kann man dabei selbst bestimmen (z.B. 10 Jahre). Einmal generiert, muss man sich in der Regel nicht mehr um das Zertifikat kümmern.

Allerdings gibt es hier immer auch einen massiven Nachteil: Selbst signierte Zertifikate werden von Client-Anwendungen nicht als vertrauenswürdig eingestuft, weil ja kein Dritter (die Zertifizierungsstelle) die Echtheit der Website bestätigen kann. Folglich zeigen Browser hier beispielsweise immer eine sehr deutliche Warnung an:

Zertifikat-Warnung im Internet Explorer

Zertifikat-Warnung im Internet Explorer

Andere Clients (z.B. Windows Smartphones bei der Synchronisierung von CardDAV/CalDAV) versagen bei selbst signierten Zertifikaten ihren Dienst.

Diesen Nachteil kann man relativ einfach umgehen: Man installiert das selbst signierte Zertifikat einfach auf sämtlichen Clients. Wie dies z.B. unter Windows bewerkstelligt werden kann, zeigt der Artikel ownCloud auf Ubuntu Server mit nginx, MariaDB und PHP (Abschnitt Zertifikat installieren (nur bei selbst signierten Zertifikaten)).
Dies ist in den meisten Fällen allerdings einfacher gesagt als getan: Solange z.B. für eine selbst gehostete Cloud-Anwendung die Anzahl der Clients überschaubar ist, hält sich der Aufwand hierfür in Grenzen. Aber spätestens wenn viele Clients zum Einsatz kommen, auf die man als Administrator keinen direkten Zugriff hat, wird die Sache kompliziert.

Trotz alledem ist die Verwendung eines selbst signierten Zertifikats nicht unsicher. Solange das Zertifikat richtig erzeugt und eingebunden wurde, ist die Verbindung verschlüsselt (und genau darum geht es ja primär im privaten Umfeld).

Zertifikate mit Let’s Encrypt

Mit einem Zertifikat von Let’s Encrypt hat man die oben genannten Probleme nicht. Wie diese Zertifikate erzeugt werden und beim Webserver nginx eingebunden werden, habe ich bereits im Artikel ownCloud 9 auf Ubuntu Server 16.04 LTS mit nginx, MariaDB, PHP 7 und Let’s Encrypt ausführlich erklärt. Hier nochmal im Schnelldurchgang, ohne auf die genaue Konfiguration des Webservers einzugehen (diese wurde detailliert im oben genannten Artikel erläutert):

Der Webserver muss auf Port 80 erreichbar sein und über eine Domain angesprochen werden können. Hier reicht auch eine DynDNS-Adresse. Ich verwende hier beispielhaft die Adresse meineseite.goip.de (wer auf der Suche nach einem guten, kostlosen DynDNS-Anbieter ist, sollte mal bei GoIP vorbei schauen). Eine IP ist für den Zertifizierungsvorgang übrigens nicht ausreichend.

Zunächst installiert man Let’s Encrypt. Unter Ubuntu Server 16.04 LTS verwendet man dazu folgende Befehle:

Anschließend kann das Zertifikat erzeugt werden:

Die Zertifikat-Dateien sind dann im Verzeichnis /etc/letsencrypt/live/meineseite.goip.de zu finden.

Das generierte Zertifikat hat eine Gültigkeitsdauer von 90 Tagen. Spätestens vor dem Ablauf dieser Frist muss das Zertifikat erneuert werden. Dazu ist folgender Befehl ausreichend, damit sämtliche bekannten Zertifikate erneuert werden:

Dies ist zwar nur ein Befehl auf der Kommandozeile und geht recht schnell, aber man sollte dies auf keinen Fall vergessen: Wenn das Zertifikat ungültig wird, werden wieder die Warnungen im Browser angezeigt und man hat wieder die gleichen Probleme wie mit einem selbst signierten Zertifikat.

Automatisierung mit Cron

Diese wichtige Aufgabe kann allerdings auch mittels Cron automatisiert werden. Dazu nutzen wir crontab:

Durch das sudo -s ist sicher gestellt, dass der folgende Befehl mit Root-Rechten ausgeführt wird.

Die zu öffnende Datei wird anschließend mit nano (oder jedem anderen beliebigen Texteditor) bearbeitet und folgender Inhalt eingetragen:

Dieser Befehl sorgt für die Erneuerung der Let’s Encrypt Zertifikate um 03:40 jeden Sonntag. Im Zweiten Schritt wird dann nginx anschließend neu geladen (damit das neue Zertifikat auch korrekt eingebunden wird). Der Zeitpunkt des Cronjobs ist hier willkürlich gewählt. Praktischerweise sollte man einen Zeitpunkt wählen, zu dem der Webserver nicht gerade unter last steht.

Der Output der Zertifikat-Erneuerung wird in der Datei /var/log/letsencrypt-renew.log ausgegeben. Hier kann dann kontrolliert werden, ob der Befehl richtig ausgeführt wurde und ob tatsächlich Zertifikate erneuert wurden (dies ist in der Regel abhängig vom Alter der bestehenden Zertifikate – normalerweise werden Zertifikate erst erneuert, wenn die Gültigkeitsdauer weniger als 30 Tage beträgt).

Die neuen Zertifikate sind anschließend im Verzeichnis /etc/letsencrypt/live zu finden. Von dieser Stelle werden sie auch von nginx eingebunden, daher reicht auch ein reload des Webservers nach dem Aufruf von letsencrypt.
Die alten Zertifikate werden in den Ordner /etc/letsencrypt/archive verschoben. Werden die archivierten Zertifikate nicht mehr benötigt, kann man diese problemlos löschen.

Trusted Zertifikat mit praktisch unbegrenzter Gültigkeitsdauer

Der Artikel hat gezeigt, wie man mit wenig Aufwand die Erneuerung von Let’s Encrypt Zertifikaten automatisieren kann. Damit hat man immer ein As im Ärmel: ein Zertifikat, welches von allen Clients als vertrauenswürdig eingestuft wird und praktisch eine unbegrenzte Gültigkeitsdauer hat.

Daher nach wie vor mein Tipp: Bevor ihr einfach auf selbst signierte Zertifikate setzt, gebt Let’s Encrypt eine Chance. Ihr werdet damit als Administrator weniger Verwaltungsaufwand haben und die Clients, die auf eure Web-Anwendung zugreifen, werden es euch danken.

Weiterführende Artikel

Links

, , , , , , ,

Kommentare: 6

  • Stefan sagt:

    Hallo, wie immer ne klasse Anleitung. Für mich als nicht Profi sind alle Anleitungen auf dieser Seite sehr verständlich.

    Vielen Dank dafür!

  • Bernd sagt:

    da schließe ich mich gerne an!
    einfach super!

    Gruß Bernd

  • Michael Beck sagt:

    Ich hab mal eine Frage zu den angeschlossenen Nextcloud Clients. Wenn ich mich per Nextcloud Windows Client auf den Nextcloud Server verbinde, nehme ich ja auch die https URL des Servers. Dabei muss ich ebenfalls ein Zertifikat annehmen. Muss ich dies dann auch jedesmal annehmen, wenn das Let`s Encrypt Zertifikat erneuert wird?
    Danke im Voraus.

    • Jan sagt:

      Hallo Michael,

      wenn das Let’s Encrypt-Zertifikat erfolgreich erstellt und eingebunden wurde, sollte eigentlich keine Warnung mehr in den Nextcloud Clients kommen. Diese Warnung zeigt ja eben genau an, dass etwas mit dem Zertifikat nicht stimmt (nicht trusted, falscher Hostname, der nicht zum Zertifikat passt, etc.).
      Was besagt die Warnung bei dir genau? Kannst mir auch gern eine Mail mit Screenshot schicken.

      Gruß,
      Jan

  • Stanley sagt:

    Danke für die Anleitung. Soweit so gut, aber wie mache ich das, wenn ich ein Zertifikat für Webmail benötige? Das muss ja in die config von roundcube eingetragen werden, habe bisher keinen Weg gefunden, wie man das per Cron lösen kann.

    Vielleicht weiß ja jemand mehr? Das Zertifikat von Plesk ist hier keine Lösung.

Schreibe einen Kommentar

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