Zertifikate fürs Homelab

Shihatsu

Legende
Thread Starter
Mitglied seit
16.08.2005
Beiträge
5.071
Ja moin! Ich hätte gern das "Problem" gelöst das jede API und ihr Hund, jedes Seite und alles mittlerweile auf HTTPS setzt. Was für Otto-normal-Internetjoe sicherlich gut ist, nervt im Homelab dann doch immer öfters an.
Ich habe zur Verfügung: Eine Domain, einen Proxmox Server auf den ich beliebiges Zeug schmeißen kann, nutze unbound als lokalen resolver (opnsense) und habe zuhause eine "meinzuhause.local" domain.
Ich habe zig Services (Homematic, Home Assistant, Webserver, diversteste Dienste, NAS, proxmox....) die gerne alle "sicher" kommunizieren würden mit diverstenen Endgeräten (Telefonen, Computern, ...) und/oder APIs (Homeassistant, Homepage, ...).

Wie löst ihr das bei euch, wie würdet ihr das lösen in meiner Situation?

P.S.: Schonmal frohes Fest...
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Ich nutze den Cert-Manager bzw. Let's Encrypt Addon bei Homeassistant mit der DNS Challenge. Der große Vorteil ist, dass man keine Webseite zum Internet offen braucht, wie bei der normalen Challenge.

Domain braucht man natürlich dafür, aber die hast du ja laut Aussage. Aufgelöst wird das ganze intern auch über pihole/unbound.
 
Wie löst ihr das bei euch, wie würdet ihr das lösen in meiner Situation?
Idealerweise besorgst du dir für ein paar € im Jahr eine normale öffentliche Domain (für dein Lab), über welche du dann Lets Encrypt Zertifikate besorgst.
Umsetzbar bspw. dann über Split Horizon DNS oÄ

P.S. von .local Domains würde ich sowieso weiten Abstand nehmen, das Schreit immer nach Problemen mit mDNS oÄ. Mittlerweile ist für sowas .internal empfohlen
 
Reverse Proxy:
Caddy
Traefik
Zoraxy
Npm
Dann gibts Subdomains homeassistant.domain.com und diese wird vom Proxy auf "nur aus dem LAN erreichbar" eingestellt.
Mit nem Wildcard Lets Encrypt Zertifikat sind automatisch alle Subdomains okay.

Cloudflare ist einer der wenigen DNS provider bei dem man * Wildcard Zertifikate auch für Lets Encrypt bekommt.

Dazu muss nur die Main Domain von aussen erreichbar sein, aber ich vermute mindestens eine (vpn) wird eh von aussen erreichbar oder?
 
Ich lasse einen Docker-Container mit Nginx Proxy Manager laufen, habe eine günstige domain bei do.de gemietet und NPM kümmert sich um das Wildcard-Zertifikat (Let's Encrypt) automatisch, da es ein Plugin für diesen Anbieter bei NPM gibt. DHCP/DNS dazu kommen von einer Pi-Hole Instanz, die Fritzbox aktualisiert meine IP bei do.de.
 
@Kavendish
Magst du das Mal etwas genauer beschreiben, besonders die grobe Konfiguration? Welche Container benötigt man da genau?
Das find ich spannend und würde gern etwas in der Art aufbauen
 
Alternativ ein eigener ACME Service, wenn man unbedingt eine eigene CA betreiben will. Zb FreeIPA, da ist Dogtag fürs Zertifikatsmanagement mit drin, und man fackelt die User Auth für Linux/Netzwerkgeräte direkt mit ab.
 
So, die ersten beiden Tage wären geschafft, ab heute ists bei mir ruhiger. Ich danke euch schon mal für eure Antworten und hoffe ihr habt noch schöne Restweihnachten!

Here we go:
Ich nutze den Cert-Manager bzw. Let's Encrypt Addon bei Homeassistant mit der DNS Challenge. Der große Vorteil ist, dass man keine Webseite zum Internet offen braucht, wie bei der normalen Challenge.

Domain braucht man natürlich dafür, aber die hast du ja laut Aussage. Aufgelöst wird das ganze intern auch über pihole/unbound.
Huom, das hört sich schon nach dem an was ich möchte, allerdings nutze ich so was lieber Stand-Alone (KISS ist wichtig!). Mal schauen ob ich das auch ohne HA hinkriege...
Idealerweise besorgst du dir für ein paar € im Jahr eine normale öffentliche Domain (für dein Lab), über welche du dann Lets Encrypt Zertifikate besorgst.
Umsetzbar bspw. dann über Split Horizon DNS oÄ

P.S. von .local Domains würde ich sowieso weiten Abstand nehmen, das Schreit immer nach Problemen mit mDNS oÄ. Mittlerweile ist für sowas .internal empfohlen
Domain ist vorhanden. Hast du einen vernünftigen Guide für Split DNS? Alles was ich im groben finde will mich immer auf Cloudflare DNS leiten - und nee, Cloudflare ist ähnlich beliebt wie Microsoft oder Google (aka: Ich nutze keine Dienste von Firmen die aktiv dem Internet schaden).

Für mDNS nutze ich einen mDNS receiver in der opnSense, daher keine Probleme mit .local, aber ja, mir ist das bewusst. Seit gefühlt 10 Jahren, und ich scheue den Umbau bisher. Interne Domain bzw. DNS-Searchlist schmeißt man nicht mal eben um im laufenden Betrieb :(
Reverse Proxy:
Caddy
Traefik
Zoraxy
Npm
Dann gibts Subdomains homeassistant.domain.com und diese wird vom Proxy auf "nur aus dem LAN erreichbar" eingestellt.
Mit nem Wildcard Lets Encrypt Zertifikat sind automatisch alle Subdomains okay.

Cloudflare ist einer der wenigen DNS provider bei dem man * Wildcard Zertifikate auch für Lets Encrypt bekommt.

Dazu muss nur die Main Domain von aussen erreichbar sein, aber ich vermute mindestens eine (vpn) wird eh von aussen erreichbar oder?
Öhm, gibts dzu dem "was" auch nen Ansatzpunkt "wie"? Weil soweit wie du war ich mit einer groben Suche auch.
Cloudflare siehe oben - brrrrrr.
Und nein, von außen ist bei mir nichts erreichbar.
Ich lasse einen Docker-Container mit Nginx Proxy Manager laufen, habe eine günstige domain bei do.de gemietet und NPM kümmert sich um das Wildcard-Zertifikat (Let's Encrypt) automatisch, da es ein Plugin für diesen Anbieter bei NPM gibt. DHCP/DNS dazu kommen von einer Pi-Hole Instanz, die Fritzbox aktualisiert meine IP bei do.de.
Meine Domain liegt bei dem Registrar RegistryGate und gehört zu einem Webhostingpaket bei All-Inkl - obs da wohl ein plugin gibt?
@Kavendish
Magst du das Mal etwas genauer beschreiben, besonders die grobe Konfiguration? Welche Container benötigt man da genau?
Das find ich spannend und würde gern etwas in der Art aufbauen
Dies. Aber ich habs mir einfach gemacht und einfach einen LXC in meinem Proxmox via pve-helper hochgezogen - einfacher gehts nicht. Aber wie gehts nach der Installation ohne offenen Service weiter, und ohne sowas wie cloudflare? Dazu finde iche rstmal nichts...
Alternativ ein eigener ACME Service, wenn man unbedingt eine eigene CA betreiben will. Zb FreeIPA, da ist Dogtag fürs Zertifikatsmanagement mit drin, und man fackelt die User Auth für Linux/Netzwerkgeräte direkt mit ab.
Eigene CA will ich auf gar keinen Fall. Da müsste ich die Chain selber ausrollen und das ding auch selber pflegen. Neee, viel zu viel OVerhead.


Stand jetzt: NPM ist installiert, aber ich weiß nicht wirklich weiter - ich will nichts nach außen aufmachen, ich will keine Zertifikate/Ketten von Hand installieren müssen, und ich hab kein Bock auf Cloudflare :(
 
ich will nichts nach außen aufmachen, ich will keine Zertifikate/
Joa, da hast du ein Problem.
NPM basiert darauf von aussen erreichbar zu sein.
Weil Lets Encrypt Zertifikate alle 3 Monate? Erneuert werden wollen.
Wenn das nicht erreichbar ist musst du DNS Einträge erstellen, und ehrlich, alle 3 monate manual Nachtragen tut keiner.

Was du könntest wäre Zertifikate selbst erstellen die sind 10 Jahre gültig. Allerdings musst du dann auf JEDEM gerät das du nutzt das Zertifikat manuell installieren. Und Android ist da bissel Heikel welche Arten es zulässt.
Aber damit kannst du dir auch was komplett eigenes wie Zuhause.Home oder so zertifizieren. Muss ja nicht gegen aussen gültig sein.
 
Ich mache das so:

  • Ich nutze den Kostenlosen Provider duckdns.org für mein Dyndns
  • Mein Router hat als "Intranet-Domain" `<mein-account>.duckdns.org`(statt `meinzuhause.local`)
  • Für jeden Service (z.B. navidrome) trage ich im Router rein festes DNS mapping ein (z.B. `navidrome.<mein-account>.duckdns.org` => `192.168.1.50`)
  • NGINX Proxy-Manager kann direkt mit der duckdns-API kommunizieren und ein Letsencrypt Wildcard-Zertifikat automatisch regelmäßig aktualisieren
  • Der NGINX Proxymanager hat zudem ein Web-Interface wo man Einträge mit Port auf den Dienst deiner Wahl (z.B. `192.168.1.50:4533`) inkl. dem automatischen SSL Zertifikat machen kann
  • Zugriff läuft dann über `https://navidrome.<mein-account>.duckdns.org` => `192.168.1.50:4533` - dank des Router-Mappings klappt das von "innen" und auch von "außen" (falls man einen Dienst ohne VPN ins Netz hängen will, wovon ich dringend abraten würde)

Nachteil: Die DNS-Einträge sind recht lang, man muss am Smartphone eine Lösung finden (ich hab das mit einer Non-SSL-Landing-Page und QR-Codes gelöst
Vorteil: Du hast sowohl aus dem Intranet als auch via VPN (ich nutze Wireguard) "echtes" SSL für all deine Hosts und neue hinzufügen / alte löschen sind ein paar Klicks im Webinterface und ändert sich mal die IP von dem Service, musst du das nur an maximal 2 Stellen ändern.

Ich habe das ganze noch mit Portainer kombiniert, so das ich prinzipiell nur die `docker-compose.yml` von einem neuen Service als Stack in Portainer hinzufüge, dann den DNS-Eintrag im Router und im NGINX-Proxy-Manager mache und schon läuft der Service mit SSL.

Klappt ganz gut und ist vom Aufwand her überschaubar - an die "langen" Domains habe ich mich sehr schnell gewöhnt, der Browser schlägt einem dann auch vor, was man braucht und man muss nix mehr tippen.
 
Für jeden Service (z.B. navidrome) trage ich im Router rein festes DNS mapping ein (z.B. `navidrome.<mein-account>.duckdns.org` => `192.168.1.50`)
Wieso?
Wenn du sowieso npm als reverse Proxy hast geht die Anfrage sowohl intern als auch von aussen zuerst an den Proxy der ja den subdomain Eintrag hat und dann korrekt weiterleitet.
Oder nicht?


Aber DuckDNS ist spitze. Hab ich ne Weile auch genutzt.
 
Ich schreibe es mal grob auf:
Disclaimer! Es ist Homelab-Gefrickel, es sollte erst einmal funktionieren, dass ich startt http://IP:Port wirklich nur host.domain.tld eingeben muss. Was vor allem für die restlichen Mitglieder des Haushalt galt.
Ich wollte lernen. Betrachtet es als unsicher. Ich weise jegliche Verantwortung für Schäden von mir.

Mein Docker-Host ist eine Ubuntu-VM auf einem Proxmox-Server.
Anfangs habe ich Docker-Compose genutzt, inzwischen jedoch Portainer, um Container in Betrieb zu nehmen.
Ich setze einfach mal voraus, dass ihr das bereits erledigt geschafft habt,

Ich nutzen den offiziellen nginx proxy manager (NPM) Container von https://nginxproxymanager.com/setup/ (ich habe die Ports nicht verändert).
Schließt die Ersteinrichtung für NPM ab, sodass ihr euch mit eurem Administrator-Account unter http://ip-des-docker-hosts:81 einloggen könnt. Hier stoppen wir jedoch erst einmal.

NPM nutzt intern certbot und ich dessen verfügbare Registrar-plugins für eine DNS-Challenge, um darüber meinen lokalen domains/hosts ein kostenloses Let's Encrypt SSL-Zertifikat unterzujubeln und diese automatisch zu erneuern. Das Ganze geht dabei über eine sehr komfortable GUI.
Mein Hosting-Anbieter ist eigentlich auch All-Inkl, leider unterstützt All-inkl certbot nur begrenzt, erst recht wenn man ein Wildcard-Zertifikat haben will. Und das wollte ich.
Da ich auf die kostenlosen Geschichten wie Cloudflare/DuckDNS (findet ihr meist bei allen möglichen YT-Tutorials) nicht wirklich Lust hatte, habe ich in den sauren Apfel gebissen und mir eine weitere Domain geholt, bei einem Anbieter aus der Liste von NPM.
1735223710703.png


Wenn ihr eine Domain bei einem Anbieter habt, gilt es folgendes Problem zu lösen:
Wie kommt eine DNS-Anfrage zu einer echten öffentlichen Domain zurück ins Heimnetz?
Dafür muss domain.tld in dem Fall nicht auf einen Webspace oder Fremdserver zeigen, sondern auf die externe IP eures Internetanschluss.
Da man es häufig doch mit dynamischen IPs vom Provider zu tun hat, muss also die IP bei eihrem Domain-Anbieter aktualisiert werden, am besten automatisch. Stichwort DynDNS/FlexDNS
1. Euer Domain-Anbieter muss dafür eine Schnittstelle bieten
2. Ihr braucht eine Software die über die Domain-Anbieter-Schnittstelle das erledigt

Eine Fritzbox kann dies für euch erledigen. PFSense/OpenSense, DD-WRT oder OpenWRT auch. Ansonsten gibt es auch schmale Linux- oder Windows-Anwendungen. Es sollte halt nur 24/7 laufen, damit der IP-Eintrag bei eurem Domain-Anbieter immer auf eure gültige externe IP zeigt.
Bei mir ist es A) Cable-Internet von Pyur und ich bekomme noch eine IPv4-Adresse. do.de lässt zu dass sich per FlexDNS die IP für das Domain-Ziel aktuell halten kann und ich nutze eine Fritzbox 6591.
1735224527216.png


Aktuell wird jedoch noch keine Anfrage nach subdomain.domain.tld durchkommen.
Ihr müsst noch erlauben, dass der Docker-Host mit dem NPM-Container von außen erreichbar ist, damit der NPM dann die subdomain.domain.tld zu der internen IP des Zielhosts weiterleiten kann.
1735224753683.png


Nun loggen wir uns in der NPM Weboberfläche ein und beantragen ein Wildcard-SSL-Zertifikat, gefiel mir besser als für jeden Host ein eigenes Zertfikat beantragen zu lassen.
Heißt in dem Zertifikart sind folgende domains eingetragen in meinem Fall *.domain.tld + *.subdomain.domain.tld + domain.tld
1735225511071.png

Wen NPM das Zertfikat erfolgreich für euch geholt hat. Geht es zu dem Punkt Hosts, und dort wird ein Proxy-Host über die GUI angelegt.
1735225586754.png

1735225713142.png
1735225984211.png

Unter SSL wählt ihr dann einfach nur das zuvor erstellt SSL-Zertifikat aus.
In meinem Beispiel ist das jetzt ein Proxmox-LXC auf einer anderen Maschine, in dem Audiobookshelf läuft.
Sämtliche Browser-Aufrufe von audibookshelf.subdomain.domain.tld werden nun korrekt aufgelöst und per https abgesichert.

(Da ich aber nicht mehr die Fritzbox als DHCP und DNS einsetze, war dann noch etwas mehr Einstellungen in Pi-hole notwendig, sollte aber hier nicht mehr relevant sein)

Aber das natürlich immer noch ein langer Name ist und sich mit der Zeit doch so einiges an Diensten oder Zielen ansammelt, habe ich dann noch Heimdall als Docker-Container 24/7 laufen, um allen Mitglieder des Haushalts eine einfache Startseite zu bieten:
 

Anhänge

  • 1735215551376.png
    1735215551376.png
    18,7 KB · Aufrufe: 6
  • 1735216062905.png
    1735216062905.png
    37,9 KB · Aufrufe: 6
  • 1735216166611.png
    1735216166611.png
    63,2 KB · Aufrufe: 7
  • 1735216359642.png
    1735216359642.png
    11,7 KB · Aufrufe: 6
Joa, da hast du ein Problem.
NPM basiert darauf von aussen erreichbar zu sein.
Weil Lets Encrypt Zertifikate alle 3 Monate? Erneuert werden wollen.
Wenn das nicht erreichbar ist musst du DNS Einträge erstellen, und ehrlich, alle 3 monate manual Nachtragen tut keiner.

Was du könntest wäre Zertifikate selbst erstellen die sind 10 Jahre gültig. Allerdings musst du dann auf JEDEM gerät das du nutzt das Zertifikat manuell installieren. Und Android ist da bissel Heikel welche Arten es zulässt.
Aber damit kannst du dir auch was komplett eigenes wie Zuhause.Home oder so zertifizieren. Muss ja nicht gegen aussen gültig sein.
Ich bin ja nicht auf npm fixiert, wenns anders geht mach ich halt das. Was ich mitlerweile geleswn habe ist das es mit caddy offenbar geht, wenn eine passende acme challenge klappt. Und das wine passwnde acme challenge via kasserver api geliefrrt werden kann. Leider mutzen alle guides dann doch wieder duckdns oder eben cloudflare...
 
Ich bin ja nicht auf npm fixiert, wenns anders geht mach ich halt das. Was ich mitlerweile geleswn habe ist das es mit caddy offenbar geht, wenn eine passende acme challenge klappt. Und das wine passwnde acme challenge via kasserver api geliefrrt werden kann. Leider mutzen alle guides dann doch wieder duckdns oder eben cloudflare...
Ich kann dir gern mal meine acme.sh versuche für All-inkl aufschreiben, da kamen zumindest auch entsprechend wildcard-certs bei rum.
Aber die Aktualisierung und verwaltung über nur NGINX war mir zu umständlich. Also mache ich nun alles in einem Abwasch über NPM statt nginx-config-files.
Beitrag automatisch zusammengeführt:

Damit bekam ich zumindest auch cert-files, die man dann manuell irgendwo einbinden oder sonst wie verteilen kann.

Download gemäß https://github.com/acmesh-official/acme.sh

Beispiel meinedomain.org:

wget -O - https://get.acme.sh | sh -s email=acme@meinedomain.org

Umgebungsvariablen für Acme.sh DNS-Plugin für All-Inkl.com KAS API setzen:

export KAS_Login="w0123456"
export KAS_Authdata="password"
export KAS_Authtype="plain"

SSL-Certs beantrangen über:
acme.sh --issue --dns dns_kas -d meinedomain.org -d *.meinedomain.org --keylength 4096
 
Zuletzt bearbeitet:
Wenn du sowieso npm als reverse Proxy hast geht die Anfrage sowohl intern als auch von aussen zuerst an den Proxy der ja den subdomain Eintrag hat und dann korrekt weiterleitet.
Mein DNS-Server ist ein OpenWRT-Router, da gehen ALLE DNS-Anfragen zuerst hin, weil der sowohl Internet-Routing, DHCP als auch Adblocking macht. OpenWRT kann ja kaum ohne manuelle Konfiguration wissen, was er mit `navidrome.<mein-account>.duckdns.org` machen soll und muss also entscheiden, dass er diese Anfrage mit der internen IP von NPM auflöst. Wenn der kein statisches mapping findet, schickt der die DNS-Auflösungsanfrage raus ins Internet und kriegt keine interne IP.

Vielleicht habe ich was unsauber gelöst, aber ich wüsste nicht, wie ich sonst dafür sorgen könnte, dass der NPM alle `<mein-account>.duckdns.org` Anfragen bekommt. Vielleicht lern ich noch was?! :-)
Beitrag automatisch zusammengeführt:

leider unterstützt All-inkl certbot nur begrenzt, erst recht wenn man ein Wildcard-Zertifikat haben will.
Nunja, das geht schon über die DNS challenge. Es gibt ja mehrere Wege nachzuweisen, dass man den Server verwaltet...

1.) Man legt eine Datei auf den Server
2.) Man erstellt einen DNS-Record (auch DNS Challenge)

Wenn man einen "internen" Server nicht nach außen hin frei geben möchte, aber trotzdem ein (Wildcard-)Zertifikat für die eigene Domain braucht, legt man beim Registrar den TXT-Eintrag an. Um das zu automatisieren braucht man irgendeine API.

acme.sh macht nix anderes als diese API-Calls (ACME Protokoll) zu abstrahieren und unabhängig vom Anbieter zu unterstützen.

All-inkl. bietet übrigens auch eine extrem unangenehme und alte SOAP-API dafür an, ich hatte mir mal ein Script gebastelt, was man als "inbetween script" in den certbot hängen konnte, der dann die TXT-Records mit der challenge angelegt hat. Braucht aber kein Mensch mehr, geht heute alles über Standards.
 
Zuletzt bearbeitet:
OpenWRT kann ja kaum ohne manuelle Konfiguration wissen, was er mit `navidrome.<mein-account>.duckdns.org` machen soll und muss also entscheiden, dass er diese Anfrage mit der internen IP von NPM auflöst.
Naja ich hab nicht wirklich professionell Ahnung von dem Zeugs.
Aber mein reversProxy (zoraxy) läuft als docker Container auf meinem OpenWRT Router.
Die Domain.tdl zeigt auf meine Public IP und port 80 und 443 werden an den Container weiter geleitet.
Sämtliche Subdomains die ich nur in Zoraxy erstelle, werden korrekt von aussen oder innen an die IP/Port weitergeleitet wie es soll.
Das lief auch vorher bei NPM bereits so.
Ich hab glaub's nicht mal mehr einen einzigen DNS Eintrag im Router. Oder höchstens die Domain.tld auf den Router.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh