INSTAR Deutschland GmbH

CA SSL-Zertifikat für den INSTAR MQTT-Broker



Q: Wie verwende ich ein offizielles Let's Encrypt Zertifikat für den INSTAR MQTT-Broker?

A: Wir haben hier ein Schritt-für-Schritt Tutorial für Sie bereitgestellt:


Mosquitto-Broker mit TLS einrichten und Instar Kamera verbinden

In diesem Artikel beschreibe ich, wie man einen Mosquitto Broker unter Debian einrichtet und eine Instar Kamera (mit und ohne TLS) mit diesem verbindet. Wir gehen gemeinsam Alles im Detail durch. Die einzigen Voraussetzungen sind, dass man mit Linux eingermaßen umgehen kann.

Mosquitto installieren

Unter Debian, sowie unter den meisten anderen Linux Distributionen, ist Mosquitto im Standard-Package-Manager verfügbar und lässt sich dementsprechend einfach installieren.

instar@debian:/# apt-get install mosquitto

Wenn die Installation erfolgreich war, sollte sich Mosquitto mit den Default-Konfigurationen direkt starten lassen.

instar@debian:/# mosquitto
1583058102: mosquitto version 1.5.7 starting
1583058102: Using default config.
1583058102: Opening ipv4 listen socket on port 1883.
1583058102: Opening ipv6 listen socket on port 1883.

Konfigurationen

Unter https://mosquitto.org/man/mosquitto-conf-5.html findet sich eine detailierte Dokumentation der Broker Konfigurationen. In diesem Artikel beschäftigung wir uns nur mit den für uns wichtigsten Einstellungen.

Wir erstellen eine neue Datei an einem beliebigen Ort. In meinem Fall nenne ich Datei 'mymosquitto.conf' und erstelle sie in meinem Home-Verzeichnis.

instar@debian:~# touch mymosquitto.conf

Mosquitto können wir mit unserer eigenen Konfiguration folgendermaßen starten.

instar@debian:~# mosquitto -c mymosquitto.conf

Wieder bekommen wir:

1583060614: mosquitto version 1.5.7 starting
1583060614: Config loaded from mymosquitto.conf.
1583060614: Opening ipv4 listen socket on port 1883.
1583060614: Opening ipv6 listen socket on port 1883.

Da wir noch keine Einstellungen überschrieben haben, hat sich gar nichts geändert.

Wir beschreiben unsere 'mymosquitto.conf' nun wie folgt, um einen alternativen Port zu verwenden:


# MyMosquitto.conf

# Unser verwendeter Port
port 1885

Die mit '#' beginnendedn Zeilen sind Kommentare und werden von Mosquitto ignoriert.

Starten wir Mosquitto erneut, erhalten wir:

instar@debian:~# mosquitto -c mymosquitto.conf
1583060614: mosquitto version 1.5.7 starting
1583060614: Config loaded from mymosquitto.conf.
1583060614: Opening ipv4 listen socket on port 1885.
1583060614: Opening ipv6 listen socket on port 1885.
1583060

Die Port-Konfiguration wurde erfolgreich überschrieben!

Zugangsbeschränkung einrichten

Mit unseren bisherigen Einstellungen kann sich jeder mit dem Broker verbinden, deshalb möchten wir zuallererst eine Zugangsbeschränkung einrichten.

Mosquitto verwendet dafür zwei Dateien.

Eine Passwortdatei, in der die User und die zugehörigen Passwörter verschlüsselt abgelegt sind und

eine Zugangsregelungsdatei in der festgelegt wird, auf welche Topics die User zugreifen können.

Passwortdatei

Wir erstellen erst die Passwortdatei. Hierfür stellt Mosquitto ein kleines Management-Tool, namens 'mosquitto_passwd', zur Verfügung.

Die Dokumentation des Tools findet sich hier: https://mosquitto.org/man/mosquitto_passwd-1.html

Wir erstellen mit folgendem Befehl eine neue Passwortdatei 'mypasswd' in unserem Home-Verzeichnis und einen User 'myuser'.

instar@debian:~# mosquitto_passwd -c mypasswd myuser

Im Anschluss werden wir dazu aufgefordert ein Passwort für unseren User anzugeben.

Ist dies gemacht, können wir einen Blick in unsere 'mypasswd' werfen. In meinem Fall sieht diese so aus.

instar@debian:~# cat mypasswd 
myuser:$6$2Iq0rwcDeUhHr06e$56B69GOFe26+YQeuARj6Q04PlL+vrqU4eF76d/mmhKxJDNJhry5DRxKFRHcL+XAnHI5xX5M1kGsqBzpF51IkeA==

In jeder Zeile gibt es einen User-Namen, gefolgt von dem zugehörigen verschlüsselten Passwort. Scheint also alles zu passen.

Achtung Das für mosquitto_passwd verwendete Argument '-c' bewirkt, dass eine neue Passwortdatei erstellt wird (Bzw. eine alte überschrieben wird). Wenn Sie einen zusätzlichen Nutzer zu einer bestehenden Passwortdatei hinzufügen wollen, dann lassen Sie das '-c' einfach weg.

Zugangsregelungsdatei

Die Zugangsregelungsdatei ist unter https://mosquitto.org/man/mosquitto-conf-5.html im Abschnitt 'acl_file' dokumentiert.

Ich erstelle hierfür die Datei 'myaclfile' in meinem Home-Verzeichnis, mit folgendem Inhalt:


user myuser
topic read mytopic
topic write mytopic

In der ersten Zeile wird der User angegeben, für den der Zugang definiert werden soll, in darauffolgenden Zeilen werden dessen Rechte bezüglich verschiedener Topics definiert. Hier ermöglichen wir dem User 'myuser' das Topic 'mytopic' zu abonnieren (Read) und darunter Nachrichten zu veröffentlichen (Write).

Angenommen, Sie haben noch einen weiteren User, sagen wir 'readuser', und wollen, dass dieser User das Topic 'mytopic' nur abonnieren, aber nichts darunter veröffentlichen kann, dann können Sie die Datei wie folgt anpassen:


user myuser
topic read mytopic
topic write mytopic
user readuser
topic read mytopic

Dateien in der Mosquitto Konfiguration hinterlegen

Haben wir nun die Passwortdatei und die Zugangsbeschränkungsdatei erstellt, dann müssen wir diese noch in unserer Mosquitto-Konfiguration angeben.

Wir passen hierfür unsere 'mymosquitto.conf' wie folgt an:


# MyMosquitto.conf

# Unser verwendeter Port
port 1885

# Wir wollen nur Verbindungen erlauben für die
# wir einen User angelegt haben.
allow_anonymous false

# Globaler Pfad zu unserer Passwortdatei
password_file /home/instar/mypasswd

# Globaler Pfad zu unserer Zugangsbeschränkungsdatei
acl_file /home/instar/myaclfile

Zum Testen bietet Mosquitto zwei kleine Anwendungen, 'mosquittosub' und 'mosquittopub', mit. Diese verwenden wir, um zu überprüfen, ob unser minimales Setting korrekt arbeitet. Unter einigen Distributionen sind diese bereits im mosquitto Package enthalten. Unter Debian müssen wir allerdings extra das Package mosquitto-clients installieren:

instar@debian:/# apt-get install mosquitto-clients

Wir starten wieder Mosquitto:

instar@debian:~# mosquitto -c mymosquitto.conf 
1583146600: mosquitto version 1.5.7 starting
1583146600: Config loaded from mymosquitto.conf.
1583146600: Opening ipv4 listen socket on port 1885.
1583146600: Opening ipv6 listen socket on port 1885.

In einer anderen Session abonnieren wir mit mosquitto_sub das Topic 'mytopic':

instart@3ec938f6f3d7:~# mosquitto_sub -h localhost -p 1885 -t mytopic -u myuser -P instar

In einer weiteren Session veröffentlichen wir eine Nachricht unter diesem Topic.

instar@3ec938f6f3d7:/# mosquitto_pub -h localhost -p 1885 -t mytopic -m "Hallo Mosquitto" -u myuser -P instar

Wie erwartet, kommt am anderen Ende unsere veröffentlichte Nachricht an.

root@3ec938f6f3d7:~# mosquitto_sub -h localhost -p 1885 -t mytopic -u myuser -P instar
Hallo Mosquitto

Alles scheint soweit zu funktionieren.

Instar Kamera mit Mosquitto verbinden

Wir brauchen einen weiteren Benutzer, den die Kamera verwenden kann, um sich mit unserem Mosquitto-Broker zu verbinden. In meinem Fall nenne ich diesen Benutzer 'kamera'.

root@3ec938f6f3d7:~# mosquitto_passwd mypasswd kamera

Wir passen unsere Zugangsbeschränkungsdatei an, um der Kamera die nötigen Berechtigungen zu geben.


user myuser
topic read mytopic
topic write mytopic
user kamera
topic write instar/+/status/#
topic read instar/+/multimedia/#
topic read instar/+/network/#
topic read instar/+/features/#
topic read instar/+/alarm/#
topic read instar/+/tasks/#
topic read instar/+/system/#

Wir möchten den Benutzer 'myuser' verwenden, um mit der Kamera zu kommunizieren. Deshalb machen wir noch folgende Anpassungen.


user myuser
topic read mytopic
topic write mytopic
topic read instar/+/status/#
topic write instar/+/multimedia/#
topic write instar/+/network/#
topic write instar/+/features/#
topic write instar/+/alarm/#
topic write instar/+/tasks/#
topic write instar/+/system/#
user kamera
topic write instar/+/status/#
topic read instar/+/multimedia/#
topic read instar/+/network/#
topic read instar/+/features/#
topic read instar/+/alarm/#
topic read instar/+/tasks/#
topic read instar/+/system/#

Zeit die Kamera zu verbinden!

Wir tragen die Domain (oder IP-Addresse), den Port unseres Mosquitto Brokers und die Daten unseres, eben erstellten, Kamera-Users in die Weboberfläche unserer Kamera ein. Um SSL kümmern wir uns vorerst nicht und der SSL Port ist somit hier egal.

alt text

Nachdem wir bestätigt haben, sollte unser Broker eine neue Verbindung melden.

instar@debian:~# mosquitto -c mymosquitto
1583752760: mosquitto version 1.6.4 starting
1583752760: Config loaded from mymosquitto.
1583752760: Opening ipv4 listen socket on port 1885.
1583752760: Opening ipv6 listen socket on port 1885.
1583752811: New connection from 10.0.0.205 on port 1885.
1583752811: New client connected from 10.0.0.205 as mosq/5eQ=1_=65m]atQXNx2 (p2, c1, k10, u'kamera').

Wir können mit mosquitto_pub alle möglichen Kamera-topics, zum testen, abonnieren.

instar@debian:~# mosquitto_sub -h mqtt.instar.com -p 1885 -t instar/# -v -u myuser -P instar
instar/aaaaaaaabeaa/status/network/config/dhcp {"val":"on"}
instar/aaaaaaaabeaa/status/network/config/ipaddr {"val":"10.0.0.205"}
instar/aaaaaaaabeaa/status/network/config/netmask {"val":"255.255.255.0"}
instar/aaaaaaaabeaa/status/network/config/gateway {"val":"10.0.0.1"}
instar/aaaaaaaabeaa/status/network/config/dns {"val":"10.0.0.1"}
instar/aaaaaaaabeaa/status/network/config/httpport {"val":"80"}
instar/aaaaaaaabeaa/status/network/config/httpsport {"val":"443"}
instar/aaaaaaaabeaa/status/network/config/rtspauth {"val":"1"}
instar/aaaaaaaabeaa/status/network/config/rtspport {"val":"554"}
instar/aaaaaaaabeaa/status/network/config/rtmpport {"val":"1935"}
instar/aaaaaaaabeaa/status/network/wifi/enable {"val":"1"}
...

SSL Verbindung einrichten

Verwendet man MQTT über das Internet, ist es auf jeden Fall zu empfehlen die Verbindung zu verschlüsseln.

SSL Key und Zertifikat erstellen

Die Generierung eines Keys ist mit openssl einfach

instar@debian:~# openssl genrsa -out mqtt.key 4096
CSR erstellen.

Im nächsten Schritt wollen wir ein CSR (Certificate Signing Request) erstellen.

instar@debian:~# openssl req -new -key mqtt.key -out mqtt.csr

Wir werden dann dazu aufgefordert ein paar Daten anzugeben, wichtig ist insbesondere die Angabe zu 'Common Name'. Hier sollten wir die Domain des Brokers angeben, dabei sind auch Wildcard Labels möglich (z.B *.instar.de) sowie, wenn auch unüblich, IP-Addressen. In meinem Fall verwende ich 'instar.com'

Country Name (2 letter code) [AU]:DE     
State or Province Name (full name) [Some-State]:Hessen
Locality Name (eg, city) []:Frankfurt
Organization Name (eg, company) [Internet Widgits Pty Ltd]:INSTAR
Organizational Unit Name (eg, section) []:INSTAR
Common Name (e.g. server FQDN or YOUR name) []:instar.com
Email Address []:r.schlarb@instar.de
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Der Befehl verwendet unsere eingegebenen Daten, extrahiert den Public Key aus der mqtt.key Datei und steckt beides in ein CSR. Mit diesem kann nun ein signiertes Zertifikat bei einer CA-Stelle beantragt werden.

Selbstsigniertes Zertifikat

Alternativ zu einem CA-signierten Zertifikat, kann man auch ein selbstsigniertes Zertifikat erstellen. Das ist mit folgendem Befehl möglich

instar@debian:~# openssl x509 -req -days 365 -in mqtt.csr -signkey mqtt.key -out mqtt.crt
Mosquitto mit TLS konfigurieren

Wir passen die Mosquitto Konfiguration an und geben dabei einen weiteren Listener, unseren Key, die Zertifikatsdatei sowie eine CAfile bzw. einen CApath an.


# MyMosquitto.conf

# Unser verwendeter Port
port 1885

# Wir wollen nur Verbindungen erlauben
# für die wir einen User angelegt haben.
allow_anonymous true

# Globaler Pfad zu unserer Passwortdatei
password_file /home/raphael/mypasswd

# Globaler Pfad
acl_file /home/instar/myaclfile

#Wir brauchen einen weiteren listener
listener 8885

# Pfad zu unserem Key
keyfile /home/instar/tls/mqtt.key

# Pfad zu unserem Zertifikat
certfile /home/instar/tls/mqtt.crt

# CA-Pfad
capath /etc/ssl/certs

Wenn Sie ein Zertifikat von einer CA-Stelle signiert lassen haben, dann sollte in die Zertifikatsdatei (hier mqtt.crt), Ihr persönliches, signiertes Zertifikat, sowie das Intermediate Zertifikat ihres CAs. Haben Sie Ihr Zertfikat selbst signiert, dann beinhaltet die Datei nur Ihr selbst signiertes Zertfikat.

Bei Mosquitto wird TLS erst aktiviert, wenn die 'capath' oder 'cafile' Option angegeben ist. Das ist ein wenig verwirrend, weil es eigentlich nicht nötig ist, wenn keine Zertifikate als Authentifizierung der Clienten verlangt werden (Siehe dazu die 'require_certificate' Option). Für uns hier, dient die Option nur dazu, um TLS zu aktivieren. Ich habe hier den Systempfad vorinstallierter Zertifikate angegeben.

Dieser Punkt wurde auch auf der Github Seite Mosquittos diskutiert. https://github.com/eclipse/mosquitto/issues/517

Wenn wir Mosquitto starten, dann sollte das ganze wie folgt aussehen.

instar@debian:~# mosquitto -c mymosquitto 
1583843307: mosquitto version 1.6.4 starting
1583843307: Config loaded from mymosquitto.
1583843307: Opening ipv4 listen socket on port 8885.
1583843307: Opening ipv6 listen socket on port 8885.
1583843307: Opening ipv4 listen socket on port 1885.
1583843307: Opening ipv6 listen socket on port 1885.

Der Port 1885 ist für unverschlüsselte Verbindungen, während der Port 8885 für TLS-Verschlüsselte Verbindungen ist.

Kamera via TLS verbinden

Jetzt muss man nur noch das Root Zertifikat bzw. das selbstsignierte Zertifikat auf die Kamera hochladen und man ist fertig.

Hier verwende ich ein von Let's Encrypt signiertes Zertifikat und muss somit das, zu meinem Zertifikat zugehörige, Let's Encrypt Root Zertifikat auf die Kamera hochladen.

alt text

Sobald bestätigt wurde, sollte unser Mosquitto Broker die neue Verbindung über den TLS Port bestätigen.

1584360853: New connection from 10.0.0.205 on port 8885.
1584360853: New client connected from 10.0.0.205 as mosq/cSQSTjYf9c=BNmDDSc (p2, c1, k10, u'kamera').