In diesem Tutorial lernen Sie, wie Sie einen MQTT Broker (Mosquitto) installieren, Authentifizierung einrichten und eine sichere Verbindung mit Zertifikaten nutzen.
1. MQTT Broker Installieren
Zuerst installieren wir einen MQTT Server (Besser als Broker bekannt). In diesem Tutorial nutzen wir die offen verfügbare Mosquitto MQTT Libraries:
sudo apt install -y mosquitto mosquitto-clients
Jetzt läuft bereits der MQTT Service und wir können das mit diesem Befehl prüfen.
sudo systemctl status mosquitto
2. Authentifizierung hinzufügen
Damit nicht jeder die Nachrichten aus dem MQTT Protokoll mitlesen kann, sollte unbedingt eine Authentifizierung eingerichtet werden. Dazu muss die mosquitto.conf angepasst werden:
sudo nano /etc/mosquitto/mosquitto.conf
#Ganz unten in der Datei fügen wir jetzt diese beiden Zeilen hinzu:
allow_anonymous false
password_file /etc/mosquitto/passwd
Als nächstes legen wir einen Benutzer an:
sudo mosquitto_passwd -b /etc/mosquitto/passwd <username> <passwort>
Nun wird der Mosquitto Service einmal neugestartet:
sudo systemctl restart mosquitto
Wenn wir uns nun mit dem folgenden Befehl in der SSH Konsole einloggen, sollten wir einen leeren Feed erhalten:
mosquitto sub -h localhost -t "test/topic" -u "<username>" -P "<passwort>"
Zum Schluss kann man nun eine neue SSH Session aufbauen und folgenden Befehl für das Senden einer MQTT Nachricht eingeben:
mosquitto_pub -h localhost -t "test/topic" -u "<username>" -P "<passwort"> -m "Hallo Welt!"
In dem eigentlich leerem Feed der ersten SSH Session sollte jetzt innerhalb weniger Millisekunden "Hallo Welt" erscheinen. Wenn man lieber eine grafische Oberfläche für das ansehen und absenden dieser MQTT Nachrichten nutzen möchte, gibt es den MQTT Explorer für alle gängigen Platformen.
3. MQTT über das Internet nutzen
Einerseits gibt es unzählige MQTT Broker Services im Web. Da in diesem Tutorial aber ein eigener Broker im Einsatz ist, stellen wir diesen jetzt auch Online, damit wir damit von überall aus der Welt verbinden können.
Zuerst (Wenn UFW läuft) muss der MQTT Port 1883 freigeschaltet werden:
sudo ufw allow 1883
Jetzt stellen wir die Mosquitto Config so um, dass der Broker nicht mehr über Localhost, sondern über die externe IP-Adresse kommunizieren kann:
sudo nano /etc/mosquitto/mosquitto.conf
#In der .conf Datei fügen wir ganz unten folgende Zeile hinzu:
listener 1883 0.0.0.0
Die IP 0.0.0.0 dient als Wildcard für alle Netzwerkadapter, die auf der Linux Machine am laufen sind. Wichtig ist, wenn die Machine hinter einem NAT Router steht, sollte auf DynDNS umgestellt werden. Diese Anleitung ist für einen V-Server im Internet.
4. Verschlüsselte Kommunikation mit SSL-Zertifikaten
Unverschlüsselter MQTT Nachrichten-Transfer kann mitgelesen werden! Daher ist es dringend empfohlen mit einem Zertifikat den Verkehr zu verschlüsseln. In diesem Tutorial nutzen wir OpenSSL.
Zuerst erstellen wir ein neues Zertifikat:
sudo openssl req -x509 -newkey rsa:4096 -keyout /etc/mosquitto/certs/privatekey.key -out /etc/mosquitto/certs/certificate.crt -days 365 -subj "/CN=<IP-ADRESSE>"
Das soeben hinterlegte Passwort kann optional entfernt werden:
sudo openssl rsa -in /etc/mosquitto/certs/privatekey.key -out /etc/mosquitto/certs/privatekey_no_pass.key
Nachdem wir die PEM Pass Phrase erneut eingegeben haben, wurde nun der Private-Key in der Datei "/etc/mosquitto/certs/privatekey_no_pass.key" hinterlegt.
Jetzt muss die "mosquitto.conf" angepasst werden:
sudo nano /etc/mosquitto/mosquitto.conf
#Ganz unten fügen wir diese 3 Zeilen hinzu:
catfile /etc/mosquitto/certs/certificate.crt
certfile /etc/mosquitto/certs/certificate.crt
keyfile /etc/mosquitto/certs/privatekey_no_pass.key
Nun muss noch der Mosquitto User/Service die Rechte zu den Dateien und Ordnern bekommen:
sudo chown -R mosquitto: /etc/mosquitto/certs/
Zum Schluss starten wir den Mosquitto Service neu:
sudo systemctl restart mosquitto
Wenn man die Verschlüsselung mit einer TLD Domain nutzen will, kann man Lets Encrypt einsetzen und kann dann sogar verhindern, dass man beim MQTT Client eine Warnung wegen "Selbstsignierten Zertifikaten" bekommt.