FHEMWEB mit Let's Encrypt Zertifikaten

Aus FHEMWiki

Certbot ist ein freies Open-Source-Tool der Electronic Frontier Foundation (EFF) mit dem automatisiert Zertifikate der Let's Encrypt CA erstellt werden können.

Diese Zertifikate können auch in FHEM verwendet werden, um mittels HTTPS auf FHEMWEB zuzugreifen.

In dieser Anleitung wird beschrieben wie Certbot installiert, Zertifikate damit erstellt und diese dann FHEM zur Verfügung gestellt werden.


Let's Encrypt Zertifikate sind in der Regel 90 Tage gültig. Beim Beantragen eines Zertifikates wird von Certbot automatisch ein systemd Timer erstellt, der kurz vor Ablauf des Zertifikat einen Prozess zur Erneuerung desselben startet. Dabei müssen die selben Voraussetzungen gegeben sein, die auch bei der Erst-Erstellung des Zertifikates nötig sind.


Certbot installieren

Voraussetzungen
  • Debian/Ubuntu/Raspberry Pi OS auf dem FHEM-Server
  • SSH-Zugang zum FHEM-Server


Die empfohlene Installationsweise ist über die Snap Paketverwaltung. Diese Anleitung geht von dieser Empfehlung aus. Wer Snap nicht verwenden möchte, findet hier weitere Informationen.


Es werden zuerst die Paket-Quellen aktualisiert. Danach erfolgt die Installation der Snap Paketverwaltung und einer Laufzeitumgebung dafür:

sudo apt update
sudo apt install -y snapd
sudo snap install core


Im nächsten Schritt kann dann der Cerbot installiert werden:

sudo snap install --classic certbot

Damit Certbot ohne Angabe seines Pfades ausgeführt werden kann, wird noch ein symbolischer Link erstellt:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Zertifikate erstellen

Certbot bietet mehrere Möglichkeiten, Let's Encrypt Zertifikate zu erstellen. Diese hängen von den jeweiligen technischen Voraussetzungen ab.

Damit ein Zertifikat ausgestellt werden kann, muss der Server bzw. der Serveradministrator bestimmte Aufgaben erfüllen um zu beweisen, dass er auch Besitzer der Domain ist, für die ein Zertifikat erstellt werden soll. Beispiele für solche Aufgaben sind z.B. einen bestimmten Record im DNS-Eintrag der Domain zu erstellen oder eine definierte Datei auf einem Webserver abzulegen. Für jede dieser Aufgaben gibt es ein Certbot Plug-In. Genauere Details finden sich auf der Webseite von Let's Encrpyt.

Welche der Möglichkeiten bzw. welches Plug-In genutzt wird, entscheidet der Serveradministrator.


Im Folgenden sind zwei verschiedene Plug-Ins erklärt. Weitere Informationen oder alternative Möglichkeiten bietet die Certbot-Dokumentation.

Standalone-Plugin

Die "standalone" Variante bietet sich an, wenn auf dem System kein Web-Server installiert ist oder mit diesem nicht interagiert werden soll/kann.

Um die Let's Encrypt Aufgabe erfüllen zu können, wird automatisch ein in Certbot eingebauter Webserver gestartet. Dieser liefert eine Datei aus, die von Let's Encrypt dann überprüft wird.


Voraussetzungen
  • Einen DNS Eintrag vom Typ A (IPv4) oder AAAA (IPv6) für eure Domain mit eurer externen IP Adresse
  • Port 80 ist auf der Firewall geöffnet und wird zum FHEM-Server weitergeleitet
  • Port 80 wird auf dem FHEM-Server von keinem anderen Service (Web-Server z.B.) verwendet


Sind alle Voraussetzungen erfüllt, kann ein Zertifikat mit folgendem Befehl beantragt werden:

sudo certbot certonly --standalone -d www.example.com -d example.com
  • --standalone bestimmt hier das zu verwendende Plug-In "standalone"
  • -d die Domain, für die das Zertifikat ausgestellt werden soll. Es können - kommagetrennt - mehrere Domains angegeben werden. Oder der Parameter -d wird einfach öfter verwendet.


Weiteres Beispiel für das Beantragen eines Zertifikates mit mehreren Domains:

sudo certbot certonly --standalone -d www.example.com -d example.com -d www.example.org -d example.org


Wer den ganzen Ablauf zuerst testen möchte, kann einen "dry-run" durchführen. Dabei wird die Ausstellung durch einen Test-Server von Let's Encrypt durchgeführt, es werden aber keine Zertifikate am FHEM-Server gespeichert:

sudo certbot certonly --standalone --dry-run -d www.example.com

Eine weitere Möglichkeit, einen ausführlicheren Testlauf durchzuführen ist, den Let's Encrypt Staging-Server (Test-Server) zu verwenden. Dabei werden Zertifikate im System abgelegt, die zwar ungültig sind, aber zu Testzwecken verwendet werden können:

sudo certbot certonly --standalone --staging -d www.example.com


DNS Plugins

Eine ganz einfache Möglichkeit zur Erstellen von Zertifikaten bieten die DNS Plug-Ins.

Dabei muss kein lokaler Server aus dem Internet erreichbar sein, sondern es wird ein bestimmter DNS-Eintrag der Domain automatisch geändert und überprüft um zu beweisen, dass der Antragsteller Inhaber der Domain ist.

Voraussetzungen


Für alle DNS Plug-Ins gilt, dass sie unter dem root-User laufen. Um das zu erlauben, ist folgender Befehl nötig:

sudo snap set certbot trust-plugin-with-root=ok

Anschließend muss das korrekte Plug-In installiert werden.

In dieser Anleitung wird die Verwendung des Cloudflare Plug-Ins erklärt. Die Funktionsweise ist bei anderen ähnlich und auf der jeweiligen Dokumentationsseite des Plug-Ins ersichtlich.


Zuerst wird das Plug-In installiert:

sudo snap install certbot-dns-cloudflare

Danach wird eine Datei erstellt, die den API-Key mit der Berechtigung zum Ändern von DNS-Einträgen bei Cloudflare beinhaltet:

sudo mkdir /root/.secrets/
sudo nano /root/.secrets/cloudflare.ini
/root/.secrets/cloudflare.ini
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = 0123456789abcdef0123456789abcdef01234567

Diese Datei muss dann noch vor unbefugtem Zugriff geschützt werden:

sudo chmod 0700 /root/.secrets/
sudo chmod 0400 /root/.secrets/cloudflare.ini

Sind diese Schritte erledigt, kann ein Zertifikat beantragt werden:

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
  --dns-cloudflare-propagation-seconds 20 \
  -d www.example.com -d example.com

Einbindung in FHEM

Um die Zertifikate nun in FHEM nutzen zu können, müssen zuerst die Berechtigungen auf diese geändert und dann symbolische Links zu Pfaden erstellt werden, wie sie FHEM erwartet.

Das Ändern der Berechtigungen ist wichtig, weil der User fhem sonst keinen Lesezugriff auf diese hätte. Das Erstellen der symbolischen Link, weil FHEM die Zertifikate im Ordner /opt/fhem/certs erwartet.

Grundsätzlich legt Certbot alle Zertifikate unter /etc/letsencrypt/archive ab. Und zwar unterschiedliche Versionen der Zertifikate. Damit Anwendungen die jeweils aktuellen Zertifikate ohne Änderung verwenden können, werden aber gleichzeitig auch symbolische Links nach /etc/letsencrypt/live gesetzt.

Kurz gesagt, für Anwendungen sind nur die jeweiligen Dateien unter /etc/letsencrypt/live relevant. Dabei vor allem:

  • /etc/letsencrypt/live/www.example.com/privkey.pem (Der private Key)
  • /etc/letsencrypt/live/www.example.com/fullchain.pem (Das erstellte Zertifikat mit der ganzen Signaturkette)


Nichts desto trotz müssen aber auf beiden Verzeichnisse (archive und live) die Zugriffsrechte geändert werden, damit der User fhem in späterer Folge daraus lesen kann. Für die Sicherheit der Zertifikate hat das keinen Einfluss, die sind durch eigene Dateisystemrechte geschützt.

sudo chmod 0755 /etc/letsencrypt/{live,archive}

Damit FHEM den Private Key lesen kann, ändern wir den Gruppenbesitz der Datei auf die Gruppe dialout:

sudo chgrp dialout /etc/letsencrypt/archive/www.example.com/privkey1.pem

Und vergeben anschließend noch eine Leseberechtigung für diese Gruppe:

sudo chmod 0640 /etc/letsencrypt/archive/www.example.com/privkey1.pem


Sind alle Berechtigungen vergeben (die sich beim Erneuern der Zertifikate nicht ändern), müssen noch symbolische Links in das Verzeichnis /opt/fhem/certs erstellt werden, da FHEM die Zertifikats-Dateien genau dort erwartet. Alle folgenden Befehle werden unter dem Benutzerkontext des Users fhem ausgeführt, damit danach keine Berechtigungen mehr verändert werden müssen.


Zuerst wird das Verzeichnis selbst erstellt:

sudo -u fhem mkdir /opt/fhem/certs

Anschließend ein symbolischer Link für den PrivateKey eingerichtet:

sudo -u fhem ln -s /etc/letsencrypt/live/www.example.com/privkey.pem /opt/fhem/certs/server-key.pem

Und danach einer für das Zertifikat:

sudo -u fhem ln -s /etc/letsencrypt/live/www.example.com/fullchain.pem /opt/fhem/certs/server-cert.pem


Die Änderung in FHEM selbst beschränken sich auf eine einzige Änderung am FHEMWEB-Device (WEB):

attr WEB HTTPS 1

Danach die Konfiguration speichern und FHEM ist ab sofort unter https://www.example.com:8083/ zu erreichen.