Lokale Domains mit SSL: Nginx Proxy Manager im Heimnetz
Schluss mit roten Browser-Warnungen für interne Dienste.
Warum die DNS-Challenge?
Normalerweise überprüft Let's Encrypt deine Domain-Inhaberschaft, indem es versucht, deine Website über Port 80 aus dem Internet zu erreichen (HTTP-Challenge). Für rein interne Dienste wollen wir aber natürlich keine Ports in unserer Router-Firewall öffnen!
Die Lösung heißt DNS-Challenge. Hierbei kommuniziert der Nginx Proxy Manager über eine API mit deinem Domain-Anbieter (z. B. Cloudflare) und hinterlegt dort temporär einen TXT-Eintrag. Let's Encrypt prüft diesen Eintrag und stellt das Zertifikat aus. Die lokalen Dienste bleiben dabei sicher hinter der Firewall verborgen.
1. Voraussetzungen
- Ein laufendes Docker-Setup (z. B. auf einem Raspberry Pi oder Intel NUC).
- Eine eigene Domain (z.B.
meinedomain.de), deren Nameserver bei einem unterstützten Anbieter wie Cloudflare liegen. - Einen Router (z. B. OpenWrt, GL.iNet, FritzBox) oder lokalen DNS-Server, bei dem sich Host-Einträge anpassen lassen.
2. Nginx Proxy Manager installieren
Wir starten den NPM ganz einfach über docker-compose. Erstelle eine Datei docker-compose.yml mit folgendem Inhalt und starte sie mit docker-compose up -d:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
3. Lokalen DNS-Eintrag setzen (Split-Brain DNS)
Damit Anfragen an nextcloud.meinedomain.de nicht ins Leere laufen oder zum echten Webserver routen, musst du deinem lokalen Router/DNS beibringen, wohin die Reise geht. Alle Zugriffe von intern müssen auf die IP deines Nginx Proxy Managers umgeleitet werden.
Beispiel OpenWrt (z. B. GL.iNet Router):
Logge dich per SSH (oder über Luci -> Network -> Hostnames) auf deinem Router ein. Füge in der Datei /etc/hosts einfach deine Dienste und die lokale NPM-IP hinzu:
# /etc/hosts
192.168.8.50 nextcloud.meinedomain.de
192.168.8.50 homeassistant.meinedomain.de
Starte danach den dnsmasq-Dienst kurz neu (/etc/init.d/dnsmasq restart). Jetzt leitet der Router Anfragen deiner Laptops und Handys an den internen NPM weiter.
4. Wildcard-Zertifikat anfordern
Logge dich unter http:// in die Admin-Oberfläche ein. Gehe auf SSL Certificates -> Add SSL Certificate -> Let's Encrypt.
- Trage bei Domain Names
*.meinedomain.deundmeinedomain.deein. - Aktiviere Use a DNS Challenge.
- Wähle deinen DNS Provider (z.B. Cloudflare) aus.
- Trage deinen API-Token in das Konfigurationsfeld ein.
- Stimme den ToS zu und klicke auf Save.
NPM besorgt sich nun automatisch das Zertifikat. Das dauert ca. 30-60 Sekunden.
5. Proxy Host anlegen
Jetzt musst du nur noch deine Dienste verknüpfen! Gehe auf Hosts -> Proxy Hosts -> Add Proxy Host.
Details-Tab:
Domain Names: nextcloud.meinedomain.de
Scheme: http oder https
Forward Hostname / IP: Die lokale IP deines tatsächlichen Dienstes (z.B. 192.168.8.60)
Forward Port: Der Port deines Dienstes (z.B. 8080)
SSL-Tab:
Wähle dein frisch erstelltes Zertifikat aus dem Dropdown-Menü. Aktiviere "Force SSL" und "Websockets Support" (letzteres ist besonders für Home Assistant wichtig!). Klicke auf Save.
Fertig! Wenn du nun in deinem Browser https://nextcloud.meinedomain.de aufrufst, erscheint das ersehnte grüne Schloss-Symbol.
Sonderfall Home Assistant (400: Bad Request)
Wenn du versuchst, Home Assistant über den Nginx Proxy Manager aufzurufen, wirst du sehr wahrscheinlich von einem 400: Bad Request Fehler begrüßt. Home Assistant blockiert sicherheitshalber alle Anfragen von Reverse-Proxys, die es nicht explizit kennt.
Um das zu beheben, musst du die IP-Adresse deines Nginx Proxy Managers in der configuration.yaml von Home Assistant als "Trusted Proxy" eintragen:
http:
use_x_forwarded_for: true
trusted_proxies:
- 192.168.8.50 # <-- IP of your NPM server
Speichere die Datei und starte Home Assistant komplett neu. Danach ist der Fehler verschwunden und deine Smart-Home-Zentrale ist über deine grüne HTTPS-Domain erreichbar!