Verschlüsselung im Heimnetzwerk ist ja immer wieder ein Thema, das zumeist mit selbst signierten Zertifikaten gelöst oder gleich ganz gelassen wird. Es ist jedoch auch möglich auf private IP Adressen ein Let’s Encrypt Zertifikat zu beziehen.
Was man braucht ist eine echte Domain. Eine lokale Domain wie .local funktioniert nicht.
tl;dr
Der Trick besteht darin, dass das Let’s Encrypt Addon auch die DNS Challenge unterstützt und man im (kompatiblen) DNS die private IP als Ziel hinterlegt.
Voraussetzungen
Ihr braucht das Let’s Encrypt Addon.
Ihr braucht eine eigene (Sub)-Domain und Zugriff auf einen kompatiblen DNS Server. Die hier ohnehin oft vorgeschlagenen sind Cloudflare und DuckDNS. Ich persönlich nutze INWX. Aber es gibt noch deutlich mehr.
Für DuckDNS, INWX und Cloudflare habe ich unten jedoch auch Beispiele aufgeführt.
Erste Schritte
Wenn Ihr das Addon installiert und die (Sub-)Domain eingerichtet habt, müsst Ihr das Addon einrichten.
Addon einrichten
Ihr geht auf das Let’s Encrypt Addon und in die Konfiguration.
Als Domains legt Ihr eure Domain oder Domains an, die ein Let’s Encrypt Zertifikat erhalten sollen. Hierbei kann auch * als Wildcard genutzt werden.
Domain eintragen
In meinem Fall nutze ich die Domain hates.social und als Subdomain für Home Assistant die Subdomain ha.hates.social. Es ist auch möglich z.B. *.hates.social einzutragen, wenn ich alle Subdomains mit Let’s Encrypt nutzen wollte. Oder noch eine oder weitere Subdomains anzulegen, wenn ich diese auf dem System nutzen würde.
In den verschiedenen Beispielen nutze ich jedoch verschiedene Domains, die vom jeweiligen Anbieter unterstützt werden bzw. dort liegen.
E-Mail Adresse
Bei der E-Mail Adresse tragt Ihr eure E-Mail Adresse ein. Diese wird von Let’s Encrypt benutzt, um euch zum Beispiel über den Ablauf der Zertifikate zu informieren.
Zertifikat Dateien
Private Key File und Certificate File bleiben einfach wie sie sind.
Challenge
Bei der Challenge, das ist der wichtige Teil, wählt Ihr dns und nicht http aus.
DNS
In das Textfeld DNS kommt die Konfiguration für euren DNS Server. Dies ist in den Beispiel Konfigurationen für verschiedene Anbieter beschrieben. Im How to Use sind die Variablen für alle Anbieter aufgeführt.
Weiter unten finden sich konkrete Beispiele inkl. dem benötigten Code für DuckDNS, INWX und Cloudflare.
–
Jetzt müsst Ihr noch die private IP (also die IP Adresse eures Home Assistant) für eure Domain im Nameserver einrichten und danach das Addon starten.
Danach bitte eure Domain (inkl. https:// und Port) in den Netzwerkeinstellungen als Lokales Netzwerk festlegen.
Außerdem müssen wir in der configuration.yaml Home Assistant sagen, dass wir ab sofort die Verschlüsselung aktivieren wollen.
Hierzu fügt man folgenden Code ein.
http:
ssl_certificate: /ssl/fullchain.pem
ssl_key: /ssl/privkey.pem
Nun nur noch Home Assistant neustarten und fertig… Die Verbindung erfolg nun direkt über die verschlüsselte Verbindung. Unverschlüsselt ist Home Assistant nicht mehr erreichbar.
–
Wichtig zu Wissen ist, dass das Addon sich automatisch beendet, nachdem das Zertifikat beantragt / erneuert wurde. Außerdem sind Let’s Encrypt Zertifikate immer nur 90 Tage gültig und müssen dann erneuert werden. (Ihr werdet vor Ablauf per E-Mail informiert, wenn die Zertifikate nicht bereits erneuert sind.)
Daher ist es sehr sinnvoll einfach Beim Booten starten zu aktivieren. Home Assistant wird durch die Updates vermutlich ohnehin regelmäßig neu gestartet und das Addon prüft dann, ob das Zertifikat erneuert werden muss.
–
Zertifikat per Automatisierung erneuern
Bei jedem Start prüft das Let’s Encrypt Addon, ob das Zertifikat erneuert werden kann / muss. Dies kann, wie beschrieben, bei jedem Neustart passieren. Wer nicht regelmäßig neustartet oder auf Nummer sicher gehen will, kann dies selbstverständlich auch per Automatisierung tun.
Automatisierung, um das Let's Encrypt Zertifikat an jedem 1. eines Monats um 3 Uhr Morgens zu starten
alias: Let's Encrypt Zertifikat erneuern
description: >-
Startet das Let's Encrypt Addon an jedem 1. eines Monats, um 3 Uhr Morgens, um
zu prüfen, ob das Zertifikat erneuert werden kann / muss.
trigger:
- platform: time
at: "03:00:00"
alias: Um 3 Uhr Morgens
condition:
- condition: template
value_template: "{{ now().day == 1 }}"
alias: Am 1. eines Monats
action:
- service: hassio.addon_start
data:
addon: core_letsencrypt
alias: Let's Encrypt starten, um das Zertifikat zu erneuern
mode: single
Deutlich häufiger zu prüfen würde eher keinen Sinn ergeben und die Let’s Encrypt Server unnötig belasten.
–
Duck DNS Config
Duck DNS dürfte ein sehr bekannter Anbieter sein, der gleichzeitig auch noch kostenfrei zu nutzen ist. In diesem Fall werden wir jedoch nicht das DuckDNS Addon nutzen, da wir dieses für unser Zertifikat nicht benötigen.
Wir wollen nur die Domain, um für keine Domain bezahlen zu müssen…
Domain anlegen
Ich habe bei DuckDNS eine Domain hates-social als hates-social.duckdns.org angelegt.
IP Updaten
Unter current ip steht zu beginn eure öffentliche IP Adresse. Diese benötigen wir nicht. Daher tragen wir dort von Hand die lokale IP Adresse unseres Home Assistant ein. Dies ist die Adresse, unter der Ihr den Home Assistant in eurem lokalen Netzwerk aufruft, ohne den Port usw.
In meinem Fall ist dies 172.23.107.2. Wenn Ihr eine Fritz!Box verwendet ist es vermutlich eher etwas wie 192.168.178.15 oder ähnlich.
Tragt diese ein, klickt auf update ip und fertig.
Addon DNS Config
Der Teil der für DuckDNS in das Textfeld DNS eingetragen werden muss, ist ziemlich simpel.
provider: dns-duckdns
duckdns_token: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
Das Token findet Ihr oben auf der DuckDNS Seite, wenn ihr eingeloggt seid.
Meine komplette Let’s Encrypt Addon Config für DuckDNS ist damit:
domains:
- hates-social.duckdns.org
email: tarag@meine-domain.tld
keyfile: privkey.pem
certfile: fullchain.pem
challenge: dns
dns:
provider: dns-duckdns
duckdns_token: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Nach einem erfolgreichen Durchlauf beendet sich das Addon automatisch wieder.
Log eines erfolgreichen Durchlauf bei DuckDNS
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
cont-init: info: running /etc/cont-init.d/file-structure.sh
cont-init: info: /etc/cont-init.d/file-structure.sh exited 0
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
services-up: info: copying legacy longrun lets-encrypt (no readiness notification)
s6-rc: info: service legacy-services successfully started
[13:05:24] INFO: Selected DNS Provider: dns-duckdns
[13:05:24] INFO: Use propagation seconds: 60
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for hates-social.duckdns.org
Waiting 60 seconds for DNS changes to propagate
Successfully received certificate.
Certificate is saved at: /data/letsencrypt/live/hates-social.duckdns.org/fullchain.pem
Key is saved at: /data/letsencrypt/live/hates-social.duckdns.org/privkey.pem
This certificate expires on 2024-03-29.
These files will be updated when the certificate renews.
NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
In den Netzwerkeinstellungen noch https://hates-social.duckdns.org:8123 als Lokales Netzwerk eintragen, Home Assistant neu starten und es funktioniert.
–
INWX Config
INWX ist ein Domainregistrar, den ich selbst sehr gerne nutze. Insbesondere, wegen der günstigen Preise bei z.B. .de Domains. Erfreulicher Weise ist auch deren Nameserver kompatibel mit den Let’s Encrypt Addon.
Domain anlegen / registrieren
Zur Nutzung muss man mindestens die Domain im Nameserver angelegt bzw. idealerweise die Domain bei INWX selbst registriert haben.
IP updaten
Meine Domains hates.social und die von mir real genutzte Subdomain ha.hates.social läuft über INWX. Hierzu habe ich einen A Eintrag auf die lokale IP Adresse angelegt. Bei mir lautet diese 172.23.107.2. Bei euch evtl. 192.168.178.15 oder entsprechend anders.
Addon DNS Config
In der Dokumentation steht, dass man den DynDNS Account von INWX benötigen würde / nutzen sollte. Ich habe es mit diesem nicht hinbekommen. Daher nutze ich meine realen Logindaten. Die Config ist aber identisch.
provider: dns-inwx
inwx_username: tarag
inwx_password: so-dumm-bin-ich-nicht
inwx_shared_secret: ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
Der Teil mit inwx_shared_secret
muss dort wohl tatsächlich so stehen, wenn Ihr keine 2FA aktiviert habt. Andernfalls muss dort das shared secret (nicht der 6-stellige Code) rein.
Mein vollständiger YAML-Code für die INWX Config lautet damit:
domains:
- ha.hates.social
email: tarag@meine-domain.tld
keyfile: privkey.pem
certfile: fullchain.pem
challenge: dns
dns:
provider: dns-inwx
inwx_username: tarag
inwx_password: so-dumm-bin-ich-nicht
inwx_shared_secret: ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
Nach einem erfolgreichen Durchlauf beendet sich das Let’s Encrypt Addon selbst wieder.
Log eines erfolgreich durchgelaufenen Logs bei INWX
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
cont-init: info: running /etc/cont-init.d/file-structure.sh
cont-init: info: /etc/cont-init.d/file-structure.sh exited 0
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
services-up: info: copying legacy longrun lets-encrypt (no readiness notification)
s6-rc: info: service legacy-services successfully started
[14:35:09] INFO: Selected DNS Provider: dns-inwx
[14:35:09] INFO: Use propagation seconds: 60
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-inwx, Installer None
Account registered.
Requesting a certificate for ha.hates.social
Performing the following challenges:
dns-01 challenge for ha.hates.social
Waiting 60 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges
Non-standard path(s), might not work with crontab installed by your operating system package manager
Successfully received certificate.
Certificate is saved at: /data/letsencrypt/live/ha.hates.social/fullchain.pem
Key is saved at: /data/letsencrypt/live/ha.hates.social/privkey.pem
This certificate expires on 2024-03-29.
These files will be updated when the certificate renews.
NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
In den Netzwerkeinstellungen noch https://ha.hates.social:8123 als Lokales Netzwerk eintragen, Home Assistant neu starten und es funktioniert.
–
Cloudflare Config
Ein sehr beliebter Anbieter ist Cloudflare. Ich nutze diesen für Domains mit .tld, die dort günstiger sind als bei INWX.
Domain anlegen
Die gewünschte Domain muss bei Cloudflare registriert sein bzw. mindestens die Cloudflare DNS Server für die Domain genutzt werden.
IP updaten
Wir müssen einen neuen DNS-Record vom Typ A für die (Sub-)Domain anlegen. Bei mir wird die Domain ha.ausbilder.org lauten. Meine lokale IP (IP des Home Assistant) ist 172.23.107.2. Bei euch ist es z.B. 192.168.178.15 oder eine andere IP.
Wichtig ist, dass der Proxy Status auf aus gestellt ist. Würde für eine private IP ohnehin keinen Sinn ergeben.
Beim Anlegen
Der fertige Eintrag
Cloudflare erkennt auch schon, dass es eine private IP ist und würde daher vermutlich den Proxy ohnehin deaktivieren.
Addon DNS Config
Die Config für das DNS Textfeld ist bei Cloudflare auch relativ simpel.
provider: dns-cloudflare
cloudflare_api_token: 0123456789abcdef0123456789abcdef01234
Den API Token muss man sich in seinem Profil (Symbol oben rechts) → API Tokens → Create Token noch erstellen. Gemeint ist hier nicht der Global API Key, der weiter unten auf der Seite steht. Dieser kann lt. Config genutzt werden, es wird jedoch nicht empfohlen.
Wir brauchen nur die API Berechtigung Zone:DNS:Edit
. Daher nutzen wir direkt das erste Template Edit zone DNS. Bei Zone Ressources habe ich es zusätzlich auf meine gewünschte Domain beschränkt.
Die Zusammenfassung zeigt:
Meine komplette YAML Config für Cloudflare ist damit:
domains:
- ha.ausbilder.org
email: tarag@meine-domain.tld
keyfile: privkey.pem
certfile: fullchain.pem
challenge: dns
dns:
provider: dns-cloudflare
cloudflare_api_token: 0123456789abcdef0123456789abcdef01234
Nach einem erfolgreichen Durchlauf beendet sich das Let’s Encrypt Addon sich selbst wieder.
Log eines erfolgreichen Durchlaufs bei Cloudflare
[14:06:01] INFO: Selected DNS Provider: dns-cloudflare
[14:06:01] INFO: Use propagation seconds: 60
[14:06:01] INFO: Use CloudFlare token
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for ha.ausbilder.org
Waiting 60 seconds for DNS changes to propagate
Successfully received certificate.
Certificate is saved at: /data/letsencrypt/live/ha.ausbilder.org/fullchain.pem
Key is saved at: /data/letsencrypt/live/ha.ausbilder.org/privkey.pem
This certificate expires on 2024-03-29.
These files will be updated when the certificate renews.
NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
In den Netzwerkeinstellungen noch https://ha.ausbilder.org:8123 als Lokales Netzwerk eintragen, Home Assistant neu starten und es funktioniert.