Anbindung externer MQTT-Broker (Mosquitto) mit TLS und eigenem CA-Zertifikat

Ich möchte meinen In-9008 via MQTT mit einem externen MQTT-Broker (Mosquitto) verbinden. Im unverschlüsselten Modus funktioniert alles prächtig.
Aktiviere ich aber den SSL-Port laufe ich in ein Zertifikate-Problem:
Der Mosquitto-Server ist mit einem von letsencrypt ausgestellten Zertifikat ausgestattet. Deshalb habe ich als CA-Zertifikat das Root-Zertifikat (ISRG Root X1) von Letsencrypt hochgeladen. Im Logfile von Mosquitto erhalte ich aber weiterhin folgende Warnung:

OpenSSL Error: error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca

Diese Fehlermeldung ist typisch, wenn sich der Client mit dem falschen CA-Zertifikat am Broker meldet. BTW: Die DDNS der INSTAR-Kamera ist unverändert.

Hallo,

ich hatte kürzlich auch ein Problem in der Richtung. Bei einem aktuellen Linux Server (oder Windows Desktop) hat man bereits das Root Zertifikat der gängigen Anbieter als „vertrauenswürdig“ im CA Store gespeichert. Bei embedded Sytem, wie der Kamera, fehlt dies.

In meinem Fall war es ein Zertifikat von GoDaddy und mir fehlte da das GoDaddy Stammzertifikat auf der Kamera und entsprechend ging nichts.

Hier ist eine Anleitung - die ist für die neuen WQHD Kameras, bei denen jetzt ein Custom CA Store für solche Fälle zur Verfügung steht. Das heißt man läd hier das CA Cert unter Netztwerk/CA hoch und das Client Cert unter Netzwerk/SSL - damit steht das eigene Zertifikat dann allen Prozessen zur Verfügung und nicht mehr nur dem MQTT Broker. Aber ansonsten ist die Einstellung identisch zu den Full HD Kameras:

Uff, ich wollte eigentlich nicht so tief in das Zertifikatsmanagement der Kamera eingreifen. So wichtig wie die Funktion ist, so komplex ist sie ebenso … mit aussprechend Potential für Nebeneffekte.

Ich hatte gehofft, und die Hilfe-Seite der MQTT-Konfiguration lässt den Schluss zu, dass mit der Zertifkat-Upload-Funktion genau das notwendige CA-Zertifikat gemeint ist ((siehe Anleitung, Step 8).

Plan B, den ich auch nehmen würde: INSTAR nimmt das „ISRG Root X1“-Zertifikat von Letsencrypt mit in de CA-Store auf (für ein Firmware-Update ;-))

Bei den neuen Kameras haben wir diesen CA Store und können diesen auch aktualisieren. D.h. die Kameras werden dann auch alles Stammzertifikate kennen, die ein regulärer Linux Server kennt.

Das ist die Aufgabe von Sicherheitsexperten - Methoden zu entwicklen die so komplex und sicher sind, dass es für den Durchschnittsnutzer einfacher wird sie zu umgehen, als sie zu implementieren :slight_smile:

Man kann erstmal testen, ob das fehlende Stamm-Cert auch wirklich das Problem ist und require_certificate in der Mosquitto conf auf false stellen:

Wenn die Kamera sich dann verbinden kann, weiß man wo der Fehler lag.

Als nächstest nimmt man dann sein CA Cert (das man zur Kamera hochgeladen hat) und copy&paste das Stamm Cert von Let’s Encryt and den Anfang dieser Datei. Wenn man mehrer findet, kann man alle reinkopieren. Dann die erweiterte ca.pem Datei zur Kamera hochladen und schauen ob die Kamera sich jetzt auch require_certificate=true verbindet.

Das was Steve da beschreibt, ist im Prinzip identisch mit dem was da im Wiki beschrieben wird. Da macht man dann halt alle Zertifikate selber, ist selbst die Authorität und braucht entsprechend kein externen Root Cert. Das geht auch immer als Plan B :slight_smile:

Die Option require_certificate bringt leider nix (getestet). Meiner Meinung nach ist sie standardmäßig sowieso auf false und dient auch dem Anfordern eines Client-Zertifikats (zur Authentifizierung).

Und dieses kann nicht verifiziert werden, wenn das Stamm Zertifikat fehlt. Damit ist das Zertifikat nicht valide und wird abgewiesen. require_certificate=false ist das gleiche wie die insecure flag bei HTTPS oder FTPS Verbindungen.

Dann, denke ich, stimmt da noch generell was nicht. Dann würde ich Plan B nehmen und erstmal selbst ein CA Cert, Server und Client Cert erstellen - also genau wie im Wiki oder Steves Anleitung. Damit läuft es dann 100%ig. Das habe ich selbst getestet.

Eventuell wird dann auch offensichtlich wo vorher der Fehler lag.

EDIT:

Hier ist der gleiche Artikel auch nochmal anhand einer Full HD Kamera:

Moment, nochmal zurück zum Anfang. Du schreibst:

Was meinst Du mit „hochgeladen“? Zur Kamera?

Das Zertifikat im UI-Abschnitt Smarthome/MQTT muß das des Servers sein, nicht das der CA.

Das der Kamera wird im Abschnitt Netzwerk/Zertifikat eingetragen. Woher kommt das bei Dir? Auch von LetsEncrypt?

Hast Du hier die vollständige „chain“ hochgeladen, also nicht nur root-Zertifikat, sondern ggf. auch Intermediate-Zertifikate?

Im Menu „Smarthome“ mit der Funktion „Upload Certificate“.

Das hatte ich missverstanden. Da ich zuvor Home Assistant mit TLS konfiguriert hatte, war ich davon ausgegangen, dass dies die CA des Servers (als Trust) sei. Aus der Hilfe werde ich aber immer noch nicht schlauer. Soll das das Zertifikat für die Kamera bzgl. Client-Authentifizierung sein?

Nachdem ich die Einstellung nun rückgängi machen wollte: Wie lässt sich denn ein Eintrag in der Konfigurationsoption „MQTT Server port (SSL)“ wieder löschen und der Kamera somit sagen, dass kein TLS genutzt werden soll? Löschen funktioniert nicht; es wird ein Port-Nummer >1 erzwungen.

Unter Netzwerk/Zertifikat wird die Identität der Kamera selbst eingerichtet. Deswegen wird hier sowohl der private als auch der öffentliche Schlüssel für das Kamera-Zertifikat benötigt. Die Kamera bringt bereits ein vorbereitetes Zertifikat mit, sodaß dieser Schritt optional ist:

Wenn Du das UI der Kamera frisch aus der Schachtel per https aufrufst, wirst Du vmtl. eine Warnung bekommen, daß mit diesem Zertifikat etwas nicht in Ordnung sei. Das liegt daran, daß das mitgelieferte Zertifikat auf „*.ddns3-instar.de“ lautet, nicht auf „meinecamera.zuhause.de“ - oder wie die Kamera bei Dir eben heißt. Das macht aber nichts, genauso wie Du im Browser auf „mach’ trotzdem“ klicken kannst, kann auch der Broker den Fehler einfach ignorieren.

Sauberer ist es natürlich, hier ein Zertifikat auf den „echten“ Namen der Kamera zur Verfügung zu stellen. Dieses Zertifikat muß der MQTT-Browser verifizieren können, entweder selbst oder extern. Bei mir ist das z.B. ein selbst generiertes Zertifikat, deswegen steht in der Config meines Brokers:

#certificate:
cafile /etc/mosquitto/certs/ca.txt
keyfile /etc/mosquitto/certs/private.txt
certfile /etc/mosquitto/certs/public.txt

cafile: Das (öffentliche) Zertifikat meiner CA, welche alle Zertifikate ausgestellt hat
keyfile: Der private Schlüssel für das Zertifikat des Brokers
certfile: Der öffentliche Schlüssel für das Zertifikat des Brokers

Damit akzeptiert der Broker die Kamera. Jetzt muß noch die Kamera den Broker akzeptieren:

Dafür wird in der Kamera unter Smarthome/MQTT das öffentliche Zertifikat des Servers (dasselbe, das auf dem Broker als „certfile“ konfiguriert ist) hinterlegt. Dieses Zertifikat muß der Server bei Kontaktaufnahme vorzeigen, damit die Kamera mit ihm redet.

That’s it. :slight_smile:

Genügt es nicht, einfach das Server-Zertifikat zu entfernen?

MfG

1 Like

Die Erklärung zum Zertifikate-Handling machen Sinn. Danke für die ausführliche Erläuterung. Ich bin nun aber doch wieder zum unverschlüsselten Modus gewechselt, da das Broker-Zertifikat aller 3 Monate aktualisiert werden muss und ich das Update auf der Kamera nicht automatisieren kann.

Wenn das Zertifikat gelöscht wird, ist wieder der unverschlüsselten Modus aktiv. Es steht zwar weiterhin eine Port-Nummer im Eingabefeld für den SSL-Server-Port, aber die scheint dann nicht mehr relevant zu sein. Also nur ein „Schönheitsfehler“.