Server / HomeServer

opnSense und Let’s Encrypt SSL Zertifikate fürs HomeLab

Wer kennt es nicht, man hat massenhaft Dienste und Services im HomeLab am Laufen und muss immer die selber signierten Zertifikate erlauben oder auf jedem System hinterlegen, um den Service nutzen zu können. In diesem Beitrag möchte ich zeigen, wie ich Let’s Encrypt bei mir im HomeLab nutze und die Zertifikate über den HA Proxy verfügbar mache. In meinem Setup wollte ich ausschließlich lokale Dienste und nichts über das Internet erreichbar machen.

Dazu verwende ich bei mir in der opnSense die zusätzlichen Plugins os-acme-client und os-haproxy, die unter System -> Firmware -> Plugins installiert werden müssen. Des Weiteren wird noch ein Domainanbieter mit API Zugriff benötigt. In meinem Fall nutze ich eine Domain von netcup und deren API. Meine Intranet URL Struktur wird später wie folgt aussehen *.intern.domain.tld.

Domain API Passwort und Key erstellen

Wie zuvor erwähnt bin ich bei netcup mit meinen Domains, hier einfach unter Stammdaten -> >_ API (oben rechts) oder direkt per Link https://www.customercontrolpanel.de/daten_aendern.php?sprung=api auf API-Passwort generieren klicken und Passwort wegspeichern. Das wird nur 1x angezeigt! Auf der rechten Seite dann Nutzungsbedingungen lesen / verstehen und über die Checkbox akzeptieren und API-Key erstellen anklicken.

ACME Client konfigurieren

Unter Services -> ACME Client -> Settings

Mit Apply bestätigen

Unter Services -> ACME Client -> Accounts

Hier kannst du für den Anfang und zum Testen die Test CA nutzen, musst du aber nicht. Wird später eh umgestellt. Die E-Mail Adresse sollte eine valide sein, da du von LE per Mails benachrichtigt wirst. Mit Save speichern

Den Account registrieren lassen. Dazu auf der rechten Seite beim Eintrag auf Register account klicken.

Unter Services -> ACME Client -> Challenge Types die API Daten von deinem Domain Anbieter eintragen. In meinem Fall immer noch netcup und mit Save bestätigen

Unter Services -> ACME Client -> Certificates muss nun das wildcard Zertifikat angelegt werden.


Der Last ACME Status sollte dann auf OK stehen.

Die opnSense mit dem Zertifikat absichern

Unter System -> Settings -> General muss auch die Domain eingetragen werden.

Unter System -> Settings -> Administration das Zertifikat auswählen, Domain hinterlegen und den Port ändern. Der Port kann frei gewählt werden, muss aber >= 1024 sein. Alles bis 1023 sind reservierte Systemports bzw. Portnummern bekannter Netzwerkdienste.

Nach dem Speichern sollte die opnSense unter der alten IP https://IP:55443 und der URL https://opnsense.intern.DOMAIN.tld:55443 erreichbar sein.

Unbound DNS Overrides

Falls der Unbound DNS noch nicht verwendet wird, muss dieser aktiviert und konfiguriert werden. Unter Services -> Unbound DNS -> General

Unter System -> Settings -> Gerneral habe ich sämtliche IPs meiner opnSense eingetragen.

Unter Services -> Unbound DNS -> Overrides müssen wir nun für jeden Service den wir über eine Subdomain erreichen wollen, einen Override anlegen. Die IP Adresse muss auf eine IP oder opnSense zeigen (wichtig). Theoretisch ginge auch der Weg über eine virtuelle IP, der Einfachheithalber habe ich diesen Schritt weggelassen. Kann aber auch später nachgezogen oder direkt erledigt werden.

Nach Änderungen an den Unbound DNS Einstellungen muss der Dienst immer neugestartet werden.

HAProxy konfigurieren

Für jeden Service, den wir unter einer Subdomain erreichen wollen, müssen wir einen echten Server unter Services -> HAProxy -> Settings -> Real Servers -> Real Servers anlegen.

Wichtig ist hier die IP (FQDN or IP), der Port und ob der Service selbst schon SSL (egal, ob es ein self signed cert ist) verwendet, unter der der Service erreichbar ist. Unser Browser geht mit der Subdomain über den HAProxy und hier wird das Let’s Encrypt Zertifikat ausgespielt. Der HAProxy selbst leitet den Traffic dann intern zu unserem Service weiter. Hier wird dann wenn SSL aktiviert das selbst signierte Zertifikat oder eben kein Zertifikat verwendet.

Unter Services -> HAProxy -> Settings -> Virtual Services -> Backend Pools wird zu jedem Backend Server ein Backend Pool angelegt. Ausnahme: Ein Backend Pool kann jedoch mehrere Backend Server enthalten. Wird aber nur beim Load Balancing benötigt.

Unter Services -> HAProxy -> Settings -> Advanced -> Map File müssen wir doch eine Subdomain auf Backend Pool Mapping erstellen. Das Mapping nutzen wir, um nicht für jeden Backend Pool einen Public Service anlegen zu müssen.

Das Mapping ist einfach und setzt sich immer wie folgt zusammen
subdomain oder komplette domain Backend Pool
homeassistant HomeAssistant_Backend
oder
homeassistant.intern.domain.tld HomeAssistant_Backend

Unter Services -> HAProxy -> Settings -> Rules & Checks -> Conditions müssen eine Condition anlegen, um http zu https redirecten zu können.

Unter Services -> HAProxy -> Settings -> Rules & Checks -> Rules müssen wir zwei Regeln anlegen. Eine um den HTTP Traffic nach HTTPS redirecten und eine um das Domain zu Backend Pool mapping durchführen zu können.

Wir nähern uns dem Ende und müssen nur noch zwei Frontends anlegen. Eins für HTTP und eins für HTTPS. Dies erledigen wir unter Services -> HAProxy -> Settings -> Virtual Services -> Public Services.

Zu guter letzt noch Test syntax und wenn keine Fehler gefunden wurden auf Apply klicken und deine Services sollten in deinem lokalen Netzwerk nun über die Subdomains erreichbar sein.

P.S.: Solltest du bei einem Service wie z.B. HomeAssistant HTTP Fehler bekommen, dann kann es daran liegen, dass du im Service den Trusted Proxy in der Config setzen musst. Bei HomeAssistant kommt, wenn man es nicht konfiguriert, ein 400 Bad Gateway Fehler.

HomeAssistant Bsp.

In der configuration.yml müssen use_x_forwarded_for und trusted_proxies eingetragen werden

http:
  ssl_certificate: ssl/fullchain.pem
  ssl_key: ssl/privkey.pem
  use_x_forwarded_for: true
  trusted_proxies:
    - 192.168.178.1
    - 127.0.0.1
    - ::1