zigbee2mqtt und SSL

Begonnen von betateilchen, 30 Dezember 2025, 13:14:51

Vorheriges Thema - Nächstes Thema

betateilchen

Moin,

gegeben ist:

  • meine zigbee2mqtt Instanz läuft als subdomain mit einem SSL-Zertifikat von Letsencrypt
  • mein mqtt Server läuft ebenfalls als subdomain mit einem SSL-Zertifikat von Letsencrypt
  • der Verbindungsaufbau zum mqtt Server mit einem selbstsignierten Client-Zertifikat funktioniert grundsätzlich, z.B. verbindet sich FHEM problemlos mit dem Zertifikat

So weit, so gut.

Nun versuche ich schon länger, den Verbindungsaufbau von z2m nach mqtt mit einem Client Zertifikat abzusichern. Und da geht das Problem los: es funktioniert nicht.

Dec 30 11:14:10 z2m node[1384]: {"level":"info","message":"z2m: Connecting to MQTT server at mqtts://<...>:8883","timestamp":"2025-12-30 11:14:10"}
Dec 30 11:14:10 z2m node[1384]: {"level":"error","message":"z2m: MQTT failed to connect, exiting... (unable to get local issuer certificate)","timestamp":"2025-12-30 11:14:10"}

Der Pfad zur CA aus der das Client-Zertifikat stammt, ist korrekt eingetragen.

Die einzige Erklärung, die ich im Moment habe: z2m kommt nicht damit klar, wenn das eigene Server-Zertifikat und ein Client-Zertifikat von unterschiedlichen CA signiert sind. Und in der z2m-Konfiguration gibt es nur ein einziges Feld für ein CA-Zertifikat.

Hat diese Konstellation mit unterschiedlichen CA schon irgendjemand zum Laufen bekommen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

passibe

Erkläre mal deine Konfiguration ein bisschen genauer, welches Zertifikat von welcher CA bzw. welcher Schlüssel ist wie bei wem hinterlegt? Im Zweifel fehlt da irgendwo eine "chain"-Datei?

Zitat von: betateilchen am 30 Dezember 2025, 13:14:51z2m kommt nicht damit klar, wenn das eigene Server-Zertifikat und ein Client-Zertifikat von unterschiedlichen CA signiert sind. Und in der z2m-Konfiguration gibt es nur ein einziges Feld für ein CA-Zertifikat.
Das hier kann ich mir eigentlich nicht vorstellen, weil das ja quasi der Regelfall ist, dass das unterschiedliche CAs sind. LE bietet ja (bald?) z.B. gar keine Zertifikate mehr für mTLS an.

betateilchen

Zitat von: passibe am 30 Dezember 2025, 15:51:19Erkläre mal deine Konfiguration ein bisschen genauer, welches Zertifikat von welcher CA

Und ich habe mir oben schon solche Mühe gegeben... ok, ich probiere es nochmal.

  • Der mqtt-Server hat ein SSL-Zertifikat von Letsencrypt, also signiert von einer Letsencrypt CA, die allgemein bekannt ist.
  • Der zigbee2mqtt-Server hat ein SSL-Zertifikat von Letsencrypt, also signiert von einer Letsencrypt CA, die allgemein bekannt ist.

Gesicherte Verbindungen zu diesen beiden Servern funktionieren einwandfrei:

  • mqtts clients über port 8883 zum mqtt-Server
  • FHEM mit MQTT2_CLIENT über port 8883 zum mqtt-Server
  • https clients über port 8080 zum zigbee2mqtt-Server



Dazu habe ich ein selbstsigniertes Client-Zertifikat von einer selbst erstellten CA.

  • Es existieren drei Dateien: "udo.crt", "udo.key" und "ca.crt"
  • Die CA-Zertifikatsdatei ca.crt ist auf dem mqtt-Server vorhanden.
  • In MQTT2_CLIENT ist im Attibut 'sslargs' hinterlegt:
    attr ... sslargs SSL_cert_file:./certs/udo.crt SSL_key_file:./certs/udo.key

Damit funktioniert die Verbindung zwischen FHEM und dem mqtt-Server ohne Username/Passwort perfekt.



In zigbee2mqtt habe ich dann versucht, ebenfalls eine Verbindung zum mqtt-Server mittels dieser Zertifikate herzustellen. Dazu habe ich in den Eingabefeldern

  • für 'cert' (Absoluter Pfad zum SSL/TLS Zertifikat für Client-Authentifizierung) die Datei 'udo.crt' mit Pfad angegeben
  • für 'key' (Absoluter Pfad zum SSL/TLS Key für Client-Authentifizierung) die Datei 'udo.key' mit Pfad angegeben

Nachdem das nicht funktioniert hatte, habe ich noch das Feld 'ca' (Absoluter Pfad zum SSL/TLS CA-Zertifikat) mit 'ca.crt' inkl. Pfad eingetragen - hat aber auch nicht funktioniert.

Da die SSL-Verbindung zum zigbee2mqtt-Frontend OHNE einen Eintrag für 'ca' funktioniert (die Letsencrypt CA ist eben bekannt) kam ich auf die Vermutung, dass beim Ausfüllen dieses Feldes die CA sowohl für die Server- als auch für die Client-Authentifizierung verwendet werden könnte.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: passibe am 30 Dezember 2025, 15:51:19Das hier kann ich mir eigentlich nicht vorstellen, weil das ja quasi der Regelfall ist, dass das unterschiedliche CAs sind.

Ja - ich denke, wenn das "bekannte" CAs sind, wird das wohl auch kein Problem sein, die muss man ja nicht explizit benennen. Aber die Kombination aus "bekannter" CA und "selbstgebauter" CA könnte halt schwierig sein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Sidey

Moin,

hast Du denn in deine ca.crt Date alle relevanten Zertifizierungsstellen hinterlegt?


Laut Doku wird sie für beides verwendet:

absolute path to SSL/TLS certificate of CA used to sign server and client certificates

Mit dem Linux Befehl update-ca-certificates kannst Du dir das bündeln lassen.

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

betateilchen

Zitat von: Sidey am 31 Dezember 2025, 09:39:15Mit dem Linux Befehl update-ca-certificates kannst Du dir das bündeln lassen.

Danke, das hatte ich alles schon gemacht und danach natürlich auch die Dateiendung geändert.

Zitat von: Sidey am 31 Dezember 2025, 09:39:15Laut Doku wird sie für beides verwendet:

Diese Info hatte ich gesucht, aber nicht gefunden. Dann deckt sich das ja mit meiner Vermutung und ich muss nicht weiter experimentieren.
Der nächste Test wird mit einem Client-Zertifikat erfolgen, das von einer "bekannten" CA signiert wurde und deshalb nicht explizit angegeben werden muss.

Dieses Jahr aber nicht mehr...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!