Mosquitto ist ein Open-Source-Message-Broker, der den Message Queuing Telemetry Transport (MQTT) verwendet ) Protokoll. Das Protokoll wurde entwickelt, um eine leichte Kommunikation mit dem Internet der Dinge (IoT) bereitzustellen ) Geräte. Es wird häufig für die GPS-Verfolgung von Fahrzeugen, die Heimautomatisierung, Umweltsensoren und die groß angelegte Datenerfassung verwendet.
Das MQTT-Protokoll läuft auf dem TCP/IP-Modell. Da es leicht ist, ermöglicht Ihnen sein kleiner Code-Fußabdruck, Anwendungen für Geräte mit minimalen Ressourcen zu erstellen. Es basiert auf dem Publish/Subscribe-Modell. Bei diesem Modell verbindet sich der Client mit dem Mosquitto-Server, der als Broker fungiert, um Informationen an andere Clients zu senden, die einen Kanal abonniert haben.
In diesem Tutorial installieren Sie Mosquitto und richten den Broker so ein, dass er SSL zum Schutz der Kommunikation verwendet.
Voraussetzungen
- Ein Ubuntu 20.04-Server mit einem Nicht-Root-Benutzer mit sudo-Berechtigungen.
- Ein Domänenname (
myqtt.example.com
) auf Ihren Server verwiesen.
Schritt 1 – Mosquitto Server und Client installieren
Ubuntu wird mit der älteren Version 1.6 von Mosquitto ausgeliefert. Um die neueste Version zu installieren, fügen Sie das offizielle Mosquitto-Repository hinzu.
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Installieren Sie den Mosquitto-Server und den Client.
$ sudo apt install mosquitto mosquitto-clients
Überprüfen Sie den Status des Servers.
$ sudo systemctl status mosquitto? mosquitto.service – Mosquitto MQTT Broker Geladen:geladen (/lib/systemd/system/mosquitto.service; aktiviert; Herstellervoreinstellung:aktiviert) Aktiv:aktiv (läuft) seit Di 2022-01-25 09:18:40 UTC; vor 25s Dokumente:man:mosquitto.conf(5) man:mosquitto(8) Haupt-PID:119694 (Mosquitto) Aufgaben:1 (Limit:2274) Speicher:1,0 MB CGroup:/system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf Jan 25 09:18:39systemd[1]:Mosquitto MQTT Broker wird gestartet ... Jan 25 09:18:40 systemd[1 ]:Mosquitto MQTT Broker gestartet.
Schritt 2 – MQTT-Passwortauthentifizierung konfigurieren
Mosquitto enthält ein Dienstprogramm zum Generieren einer Kennwortdatei namens mosquitto_passwd
. Mosquitto speichert alle Konfigurationen in /etc/mosquitto
Verzeichnis.
Führen Sie den folgenden Befehl aus, um eine verschlüsselte Passwortdatei unter /etc/mosquitto/passwd
zu generieren für den Benutzernamen username
. Geben Sie ein Passwort Ihrer Wahl ein.
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd BenutzernamePasswort:Passwort erneut eingeben:
Als nächstes erstellen Sie eine default.conf
Datei unter /etc/mosquitto/conf.d
Verzeichnis und öffnen Sie es zum Bearbeiten.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Fügen Sie die folgenden Zeilen ein, um den Speicherort der Kennwortdatei anzugeben. Wenn Sie das Listener-Feld weglassen, wird die Verbindung immer anonym hergestellt, unabhängig von der Konfiguration.
Listener 1883Passwortdatei /etc/mosquitto/passwd
Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.
Starten Sie den Mosquitto-Server neu, um die Änderung zu implementieren.
$ sudo systemctl Mosquitto neu starten
Schritt 3 – Testen Sie den Mosquitto-Client
Je nach Anwendungsfall können Sie mit dem Mosquitto-Client Nachrichten zu unterschiedlichen Themen senden und empfangen. Ein Kunde ist entweder ein Abonnent oder ein Herausgeber.
Der nächste Schritt besteht darin, ein Thema zu abonnieren. Im MQTT-Protokoll bezieht sich ein Thema auf eine Zeichenfolge, die vom Server/Broker verwendet wird, um Nachrichten für die verbundenen Clients zu filtern. Hier sind einige Beispielthemen, die Sie in einer Heimautomatisierungsanwendung verwenden können.
- home/lights/sitting_room
- Haus/Licht/Küche
- home/lights/master_bedroom
- home/lights/kids_bedroom
Um ein Thema zu abonnieren, führen Sie mosquitto_sub -t
aus Befehl gefolgt vom Thema. Zum Beispiel, um home/lights/kitchen
zu abonnieren Thema, führen Sie den folgenden Befehl aus.
$ mosquitto_sub -u Benutzername -P YOUR_PASSWORD -t "home/lights/kitchen"
Schließen Sie das vorhandene Fenster nicht. Öffnen Sie ein neues Terminalfenster, um eine Nachricht an home/lights/kitchen
zu veröffentlichen Thema mit dem folgenden Befehl.
$ mosquitto_pub -u Benutzername -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"
Gehen Sie zurück zum ersten Terminalfenster und Sie erhalten ON
Nutzlast.
EIN
Als nächstes senden Sie den OFF
Nachricht zum gleichen Thema vom zweiten Terminal.
$ mosquitto_pub -u Benutzername -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"
Das erste Terminal zeigt die neu veröffentlichte Nachricht.
EINAUS
Wenn Sie versuchen, einen nicht authentifizierten Kommentar zu senden, schlägt dies fehl. Versuchen Sie beispielsweise den folgenden Befehl.
$ mosquitto_sub -t "home/lights/sitting_room"Verbindungsfehler:Verbindung abgelehnt:nicht autorisiert.
Es wird nicht empfohlen, aber Sie müssen die folgende Zeile zu /etc/mosquitto/conf.d/default.conf
hinzufügen Datei, wenn Sie die Befehle ohne Authentifizierung ausführen möchten.
allow_anonymous true
Schritt 4 – SSL installieren
Um ein SSL-Zertifikat mit Let’s Encrypt zu installieren, müssen wir das Certbot-Tool herunterladen. Wir werden dafür das Snapd-Paketinstallationsprogramm verwenden.
Installieren Sie das Snap-Installationsprogramm.
$ sudo apt install snapd
Stellen Sie sicher, dass Ihre Version von Snapd auf dem neuesten Stand ist.
$ sudo snap install core $ sudo snap refresh core
Certbot installieren.
$ sudo snap install --classic certbot
Verwenden Sie den folgenden Befehl, um sicherzustellen, dass der Certbot-Befehl ausgeführt wird, indem Sie einen symbolischen Link zu /usr/bin
erstellen Verzeichnis.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Generieren Sie ein SSL-Zertifikat.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com
Der obige Befehl lädt ein Zertifikat in /etc/letsencrypt/live/mqtt.example.com
herunter Verzeichnis auf Ihrem Server.
Erstellen Sie eine Diffie-Hellman-Gruppe Zertifikat.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Erstellen Sie ein Challenge-Web-Root-Verzeichnis für die automatische Verlängerung von Let's Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Erstellen Sie einen Cron-Job, um das SSL zu erneuern. Es wird jeden Tag ausgeführt, um das Zertifikat zu überprüfen und bei Bedarf zu erneuern. Erstellen Sie dazu zunächst die Datei /etc/cron.daily/certbot-renew
und zum Bearbeiten öffnen.
$ sudo nano /etc/cron.daily/certbot-renew
Fügen Sie den folgenden Code ein.
#!/bin/shcertbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.
Ändern Sie die Berechtigungen für die Aufgabendatei, um sie ausführbar zu machen.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Schritt 5 – MQTT SSL konfigurieren
Nachdem wir nun die SSL-Zertifikate bereit haben, müssen wir Mosquitto Zugriff darauf gewähren. Dazu müssen wir die Zertifikate an einen Ort kopieren, von dem aus Mosquitto darauf zugreifen kann.
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey. pem /etc/mosquitto/certs/server.key
Ändern Sie den Besitz von /etc/mosquitto/certs
Verzeichnis zum mosquitto
Benutzer, der während der Installation erstellt wurde.
$ sudo chown mosquitto:/etc/mosquitto/certs
Der nächste Schritt zum Aktivieren der SSL-Verschlüsselung für Mosquitto besteht darin, den Speicherort der SSL-Zertifikate anzugeben. Öffnen Sie die Konfigurationsdatei zum Bearbeiten.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Fügen Sie den folgenden Code am Ende der Datei ein.
Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden. Achten Sie darauf, am Ende der Datei einen abschließenden Zeilenumbruch zu hinterlassen.
Der listener 8883
Teil richtet den verschlüsselten Listener ein. Es ist der Standardport für MQTT + SSL, der als MQTTS bezeichnet wird. Die nächsten vier Zeilen geben den Speicherort der SSL-Dateien an.
Starten Sie Mosquitto neu, um die Einstellungen zu aktualisieren.
$ sudo systemctl Mosquitto neu starten
Sie müssen die Firewall aktualisieren, um Verbindungen zu Port 8883 zuzulassen.
$ sudo ufw erlauben 8883
Als nächstes müssen wir die Funktionalität mit mosquitto_pub
testen Befehl.
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
Wie Sie sehen können, haben wir bestimmte zusätzliche Parameter hinzugefügt, darunter die Portnummer und den Pfad zu den SSL-Zertifikaten. Wann immer Sie SSL verwenden müssen, müssen Sie immer den vollständigen Hostnamen angeben, d. h. mqtt.example.com
statt localhost
andernfalls würde es einen Fehler geben.
Sie müssen auch --capath
hinzufügen Anweisung jedes Mal. Es weist den Mosquitto-Client an, nach Root-Zertifikaten zu suchen, die vom Betriebssystem installiert wurden.
Schritt 6 – SSL-Verlängerung konfigurieren
Certbot erneuert Ihr Zertifikat automatisch, bevor es abläuft. Aber es muss gesagt werden, dass es die erneuerten Zertifikate nach /etc/mosquitto/certs
kopieren soll Verzeichnis und starten Sie den Mosquitto-Dienst neu.
Wir werden das tun, indem wir ein Shell-Skript erstellen. Erstellen Sie eine Datei mosquitto-copy.sh
in /etc/letsencrypt/renewal-hooks/deploy
Verzeichnis.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Fügen Sie den folgenden Code darin ein. Ersetzen Sie den Wert von MY_DOMAIN
Variable mit Ihrer Domain. Der ${RENEWED_LINEAGE}
Variable zeigt auf /etc/letsencrypt/live/mqtt.example.com
Verzeichnis während der Erneuerung.
# Legen Sie fest, für welche Domain dieses Skript ausgeführt werden sollMY_DOMAIN=mqtt.example.com# Legen Sie das Verzeichnis fest, in das die Zertifikate kopiert werden.CERTIFICATE_DIR=/etc/mosquitto/certsif [ "${RENEWED_DOMAINS}" ="${ MEINE_DOMAIN}" ]; then # Neues Zertifikat ins Mosquitto-Verzeichnis kopieren cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Eigentümerschaft auf Mosquitto chown mosquitto setzen:${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Sicherstellen, dass die Berechtigungen restriktiv sind chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Mosquitto anweisen, Zertifikate und Konfiguration neu zu laden pkill -HUP -x mosquittofi
Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.
Machen Sie die Datei ausführbar.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Dieses Skript wird automatisch bei jeder erfolgreichen Verlängerung des Zertifikats ausgeführt.
Wenn Sie Mosquitto und einen Webserver wie Nginx ausführen, müssen Sie Certbot anweisen, den Server vor der Erneuerung zu stoppen und nach Abschluss erneut zu starten. Öffnen Sie dazu die Datei etc/letsencrypt/renewal/mqtt.example.com.conf
.
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Fügen Sie die folgenden Zeilen am Ende der Datei hinzu. Passen Sie die Befehle entsprechend dem von Ihnen verwendeten Webserver an.
pre_hook =systemctl stoppt nginxpost_hook =systemctl startet nginx
Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.
Führen Sie zur Überprüfung einen Certbot-Trockenlauf durch.
$ sudo certbot renew --dry-run
Wenn Sie keine Fehler sehen, bedeutet dies, dass alles eingestellt ist.
Schritt 7 – Websockets konfigurieren
Sie können Mosquitto so konfigurieren, dass es das MQTT-Protokoll in Browsern verwendet, die Javascript verwenden, indem Sie die Websockets-Funktionalität verwenden. Um es zu aktivieren, öffnen Sie die Konfigurationsdatei.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Fügen Sie die folgenden Zeilen am Ende der Datei ein.
Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.
Wie Sie bemerken, ist es derselbe Block wie der, den wir zum Aktivieren von SSL verwendet haben, mit Ausnahme der Portnummer und der Protokollfelder. 8083 ist der gebräuchlichste Port, der von MQTT verwendet wird, um mit WebSockets zu kommunizieren.
Starten Sie den Mosquitto-Dienst neu.
$ sudo systemctl Mosquitto neu starten
Öffnen Sie Port 8083.
$ sudo ufw erlauben 8083
Wir müssen einen browserbasierten MQTT-Client verwenden, um die WebSockets-Funktionalität zu testen. Es sind viele Clients verfügbar, aber wir werden den HiveMQ-Websocket-Client für unseren Zweck verwenden. Starten Sie den Client in Ihrem Browser und Sie werden Folgendes sehen.
Füllen Sie die Felder wie im obigen Screenshot gezeigt aus.
- Der Host sollte die Domäne Ihres Mosquitto-Servers sein, mqtt.example.com.
- Port sollte 8083 sein.
- ClientID-Feld kann so belassen werden.
- Der Benutzername sollte Ihr Mosquitto-Benutzername sein.
- Passwort sollte das Passwort sein, das Sie oben erstellt haben.
- Überprüfen Sie das SSL Feld.
Drücken Sie auf Verbinden klicken, und der HiveMQ-Client wird mit Ihrem Mosquitto-Server verbunden.
Sobald die Verbindung hergestellt ist, geben Sie home/lights/kitchen
ein Geben Sie als Thema eine beliebige Nachricht ein und klicken Sie auf Veröffentlichen .
Die Nachricht wird in Ihrem mosquitto_sub
angezeigt Terminalfenster, das die erfolgreiche Verbindung bestätigt.
Dies zeigt, dass die Websockets-Implementierung erfolgreich ist.
Schlussfolgerung
Damit ist unsere Einrichtung eines sicheren, passwortgeschützten und SSL-verschlüsselten MQTT-Servers auf einem Ubuntu 20.04-basierten Rechner abgeschlossen. Wenn Sie Fragen haben, posten Sie diese in den Kommentaren unten.