Wenn man Home Assistant als Hass.io Community Package auf einem Synology NAS betreibt, ist die Home Assistant Oberfläche erstmal nur ungesichert per HTTP auf Port 8123 erreichbar. Gerade für den Zugriff aus dem Internet ist das natürlich nicht erstrebenswert – HTTPS sollte dabei mindestens zum Einsatz kommen, besser noch ein VPN.
Für die Einrichtung von HTTPS gibt es im Hass.io Add-On Store gleich zwei „official add-ons“: Duck DNS nutzt Let’s Encrypt und verbindet sich dabei direkt mit dem gleichnamigen DynDNS-Dienst, um einen Hostnamen wie z.B. meinha.duckdns.org
bereitzustellen. Für die Nutzung mit eigenen Domains ist es jedoch nicht geeignet.
Das Add-On Let’s Encrypt hingegen sollte eigentlich genau das ermöglichen – wenn es dabei nicht ein paar Stolpersteine gäbe, die die Nutzung schlussendlich in den meisten Fällen unmöglich machen. Zur Bestätigung des Domain-Besitzes bietet Let’s Encrypt verschiedene Verfahren, wovon dieses Add-On die Verifizierung per HTTP sowie per DNS anbietet. HTTP erfordert dabei einen Zugriff durch Let’s Encrypt auf eine bestimmte Datei auf Port 80 der Hass.io-Installation bzw. in diesem Fall des NAS, was fehlschlagen muss, weil Port 80 bereits vom DSM selbst verwendet wird. DNS als Verifizierungsmethode hingegen scheitert, weil der Zugriff auf die DNS-Datensätze des Domain-Anbieters dabei per API erfolgen muss und kaum jemand in Deutschland Kunde bei einem der wenigen unterstützen Domain-Anbieter sein dürfte.
Was bleibt? Eine manuelle Einrichtung innerhalb des Home Assistant Docker Containers? Kaum machbar, die Zertifikate laufen jeweils nur 90 Tage und müssen daher regelmäßig ausgetauscht werden. Nach langem Überlegen kam mir dann eine Idee: Die Software des Synology NAS, der Disk Station Manager (kurz: DSM), verfügt bereits über Let’s Encrypt-Unterstützung! Die Zertifikate werden dabei automatisch aktuell gehalten und zum sicheren Aufruf der DSM Weboberfläche verwendet. Was liegt näher, als diese Zertifikate direkt auch für Home Assistant zu verwenden?
Der DSM besteht im Grunde genommen aus einem regulären Linux, welches Synology um die eigenen Funktionen erweitert und über die DSM Weboberfläche administrierbar macht. Das Linux Dateisystem ist zwar eigentlich versteckt, aber über den aktivierbaren SSH-Zugang kann man sich auf dem Hostsystem einloggen und dort als root auch beliebig Schaden anrichten. Nach kurzer Suche habe ich dort den Speicherort der Zertifikate ausfindig machen können: Sie liegen unter /usr/syno/etc/certificate/system/default
.
Für die Nutzung mit Home Assistant benötigen wir sie jedoch im Docker-Container namens homeassistant, der seine Daten regulär auf dem NAS ablegt – der Speicherort wird bei der Einrichtung des Hass.io Community Packages ausgewählt. In meinem Falle sollen die Zertifikate im Ordner /volume1/docker/hass.io/ssl
landen.
Nur wie kommen sie dort hin? Glücklicherweise bietet der DSM in der Systemsteuerung einen Aufgabenplaner, der auch Shell-Scripte verarbeiten kann. Dort habe ich eine tägliche Aufgabe erstellt, die die Zertifikate ans gewünschte Ziel kopiert, sofern sie dort älter oder nicht vorhanden sind, und anschließend den Docker Container neu startet. Die folgenden Zeilen können direkt als „benutzerdefiniertes Skript“ eingefügt werden (Pfade ggf. anpassen!):
SRC="/usr/syno/etc/certificate/system/default" DEST="/volume1/docker/hass.io/ssl" if [ ! -f "$DEST/fullchain.pem" ] || [ "$SRC/fullchain.pem" -nt "$DEST/fullchain.pem" ]; then cp "$SRC/fullchain.pem" "$DEST/" cp "$SRC/privkey.pem" "$DEST/" chown root:root "$DEST/fullchain.pem" "$DEST/privkey.pem" chmod 600 "$DEST/fullchain.pem" "$DEST/privkey.pem" /usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container version=1 method=restart name=homeassistant fi
Der Neustart des Containers über den synowebapi
-Aufruf anstatt via docker restart
sorgt dafür, dass sich der DSM nicht über einen unerwartet gestoppten Container beschwert.
Schließlich muss in der Home Assistant Konfiguration noch SSL aktiviert werden. Dies geschieht über einige Konfigurationszeilen in der configuration.yaml
:
http:
ssl_certificate: /ssl/fullchain.pem
ssl_key: /ssl/privkey.pem
Das war es schon. Nach dem obligatorischen Home Assistant Neustart sollte die Oberfläche nun ausschließlich via HTTPS erreichbar sein (üblicherweise auf Port 8123).
Hallo, super vielen Dank. Das Script hat mir sehr geholfen 🙂
Nun zu meiner Frage:
Ich habe Adguard Home in der VMM laufen und bräuchte für die Verschlüsselung eine Verlinkung von der VMM zum lokalen Speicher des NAS. Wie kann ich auf die lokale Festplatte verlinken wo die Zertifikate liegen?
Und wie ist das wenn man mehrere Letsencrypt Zertifikate hat, in welchem Verzeichnis liegen die anderen auf dem Nas?
VM und NAS sind wie zwei getrennte PCs. Da kannst du nur z.B. eine Freigabe mounten.
Wo die weiteren Zertifikate auf dem NAS liegen ist mir nicht bekannt, ich habe keine weiteren verwendet.
Once I configured this, I lost access to my home assistant android authentication. It goes in and since the site is not secured I can bypass hat on the web. But not on the android app.
Sorry, can’t confirm this. The android app is working fine here.
Hallo Jens,
prima Sript, das ich gerne auch für mich nutzen würde. Habe nur das Problem, dass meine HA Installation Vers. 0.116.4 auf einem Raspberry im LAN zusammen mit der Synology Station läuft. Let’s encrypt ist installiert und die Zertifikate liegen in dem von Dir angegebenen Ordner.
Bin mir nicht klar, was bei Deinem Script unter DEST= eintragen muss? Kannst Du mir da weiterhelfen?
Danke und Gruß,
Herbert
Das funktioniert in diesem Fall leider nicht so einfach. Das Script kopiert ja nur auf dem lokalen Volume des NAS hin und her, da hat der RasPi aber erstmal nichts davon. Ggf. könntest du die Zertifikate vielleicht mit scp auf den RasPi kopieren, aber das kommt sehr auf das genaue Setup an. Alternativ könntest du auch ein Verzeichnis deines NAS auf dem RasPi mounten, in dem dann die Zertifikate liegen.
Pingback: SSL certificate in Hass.io & Home Assistant Core on Synology – #024 | All about hosting
Hallo,
danke für den super Artikel, das spart mir viele Probleme (alle 3 Monate Zertifikat kopieren) und man kommt hier sogar direkt an fullchain ! Das braucht man ja für den HomeAssistant, bisher habe ich cert und chain per Hand zusammenkopiert
(da Synology beim exportieren die fullchain nicht mit exportiert).
Jetzt die Frage, wie hast du die Wiederholung für das Script eingestellt? Das Zertifikat wird ja alle 2 Monate Erneuert? Aber weiß man den genauen Tag? Man kann auch bei der Wiederholung nur einstellen „alle 2 Monate“ aber sind das genau 60 Tage oder wird das anders gehandhabt?
mfg
Hallo, das Script bzw. die Aufgabe im Aufgabenplaner läuft bei mir täglich um 23:30 Uhr. Das ist kein Problem, weil:
if [ ! -f "$DEST/fullchain.pem" ] || [ "$SRC/fullchain.pem" -nt "$DEST/fullchain.pem" ]; then
Die Zeile bedeutet: Wenn am Ziel keine fullchain.pem liegt ODER die fullchain.pem im Ziel älter ist als an der Quelle, dann …
Somit macht das Script einfach nichts, solange kein neues Zertifikat gefunden wird.
Oh klar – macht sinn, danke nochmal dafür.