So installieren und sichern Sie den Mosquitto MQTT Messaging Broker unter Ubuntu 18.04 [Schnellstart]

Einführung

MQTT ist ein Machine-to-Machine-Messaging-Protokoll, das eine einfache Publish / Subscribe-Kommunikation für „Internet of Things“ -Geräte ermöglicht. Mosquitto ist ein beliebter MQTT-Server (oderbroker im MQTT-Sprachgebrauch), der eine hervorragende Community-Unterstützung bietet und einfach zu installieren und zu konfigurieren ist.

In diesem komprimierten Schnellstart-Tutorial installieren und konfigurieren wir Mosquitto und verwenden die Option "SSL-Zertifikate verschlüsseln", um unseren MQTT-Datenverkehr zu sichern. Wenn Sie ausführlichere Informationen zu einem der Schritte benötigen, lesen Sie bitte die folgenden Tutorials:

Voraussetzungen

Bevor Sie dieses Tutorial starten können, benötigen Sie:

  • Ein Ubuntu 18.04-Server mit einem nicht root-fähigen, sudo-fähigen Benutzer und einer grundlegenden Firewall, wie inthis Ubuntu 18.04 server setup tutorial beschrieben

  • Ein Domainname, der auf Ihren Server verweist. In diesem Tutorial wird durchgehend der Platzhaltermqtt.example.com verwendet

  • Port 80 muss auf Ihrem Server nicht verwendet werden. Wenn Sie Mosquitto auf einem Computer mit einem Webserver installieren, der diesen Port belegt, müssen Sie zum Abrufen von Zertifikaten eine andere Methode verwenden, z. B.webroot modevon Certbot.

[[Schritt-1 - Installieren der Software]] == Schritt 1 - Installieren der Software

Zuerst installieren wir ein benutzerdefiniertes Software-Repository, um die neueste Version von Certbot, dem Let's Encrypt-Client, zu erhalten:

sudo add-apt-repository ppa:certbot/certbot

Drücken SieENTER, um zu akzeptieren, und installieren Sie dann die Softwarepakete für Mosquitto und Certbot:

sudo apt install certbot mosquitto mosquitto-clients

Als Nächstes holen wir unser SSL-Zertifikat ab.

[[Schritt-2 - Herunterladen eines SSL-Zertifikats]] == Schritt 2 - Herunterladen eines SSL-Zertifikats

Öffnen Sie Port80 in Ihrer Firewall:

sudo ufw allow 80

Führen Sie dann Certbot aus, um das Zertifikat abzurufen. Stellen Sie sicher, dass Sie den Domainnamen Ihres Servers hier ersetzen:

sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com

Sie werden aufgefordert, eine E-Mail-Adresse einzugeben und den Nutzungsbedingungen zuzustimmen. Anschließend sollten Sie eine Meldung erhalten, die besagt, dass der Vorgang erfolgreich war und wo Ihre Zertifikate gespeichert sind.

Wir werden Mosquitto so konfigurieren, dass diese Zertifikate als Nächstes verwendet werden.

[[Schritt-3 - Konfigurieren von Mücken]] == Schritt 3 - Konfigurieren von Mücken

Zuerst erstellen wir eine Kennwortdatei, mit der Mosquitto Verbindungen authentifiziert. Verwenden Sie dazumosquitto_passwd, und ersetzen Sie dabei Ihren bevorzugten Benutzernamen:

sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username

Sie werden zweimal zur Eingabe eines Passworts aufgefordert.

Öffnen Sie nun eine neue Konfigurationsdatei für Mosquitto:

sudo nano /etc/mosquitto/conf.d/default.conf

Dies öffnet eine leere Datei. Fügen Sie Folgendes ein:

/etc/mosquitto/conf.d/default.conf

allow_anonymous false
password_file /etc/mosquitto/passwd

listener 1883 localhost

listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

Stellen Sie sicher, dass Siemqtt.example.com durch den in Schritt 2 verwendeten Domainnamen ersetzen. Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Diese Datei führt Folgendes aus:

  • Deaktivieren Sie anonyme Anmeldungen

  • Verwendet unsere Passwortdatei, um die Passwortauthentifizierung zu aktivieren

  • Richtet einen ungesicherten Listener an Port 1883 nur fürlocalhost ein

  • Richtet einen sicheren Listener für Port8883 ein

  • Richtet einen sicheren Websocket-basierten Listener für Port8083ein

Starten Sie Mosquitto neu, um die Konfigurationsänderungen zu übernehmen:

sudo systemctl restart mosquitto

Überprüfen Sie, ob der Dienst erneut ausgeführt wird:

sudo systemctl status mosquitto
Output● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated)
   Active: active (running) since Mon 2018-07-16 15:03:42 UTC; 2min 39s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 6683 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
  Process: 6699 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
    Tasks: 1 (limit: 1152)
   CGroup: /system.slice/mosquitto.service
           └─6705 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Der Status sollteactive (running) sein. Ist dies nicht der Fall, überprüfen Sie Ihre Konfigurationsdatei und starten Sie sie erneut. Weitere Informationen finden Sie möglicherweise in der Protokolldatei von Mosquitto:

sudo tail /var/log/mosquitto/mosquitto.log

Wenn alles in Ordnung ist, verwenden Sieufw, um die beiden neuen Ports durch die Firewall zuzulassen:

sudo ufw allow 8883
sudo ufw allow 8083

Nach der Einrichtung von Mosquitto konfigurieren wir Certbot so, dass Mosquitto nach der Erneuerung unserer Zertifikate neu gestartet wird.

[[Schritt-4 - Konfigurieren von Certbot-Erneuerungen]] == Schritt 4 - Konfigurieren von Certbot-Erneuerungen

Certbot erneuert unsere SSL-Zertifikate automatisch, bevor sie ablaufen. Es muss jedoch mitgeteilt werden, dass der Mosquitto-Dienst danach neu gestartet werden soll.

Öffnen Sie die Certbot-Erneuerungskonfigurationsdatei für Ihren Domainnamen:

sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

Fügen Sie in der letzten Zeile die folgende Optionrenew_hook hinzu:

/etc/letsencrypt/renewal/mqtt.example.com.conf

renew_hook = systemctl restart mosquitto

Speichern und schließen Sie die Datei, und führen Sie dann einen Certbot-Testlauf aus, um sicherzustellen, dass die Syntax in Ordnung ist:

sudo certbot renew --dry-run

Wenn Sie keine Fehler sehen, sind Sie fertig. Lassen Sie uns als Nächstes unseren MQTT-Server testen.

[[Schritt-5 -–- Testen der Mücke]] == Schritt 5 - Testen der Mücke

In Schritt 1 haben wir einige Befehlszeilen-MQTT-Clients installiert. Wir können das Thematest auf dem localhost-Listener wie folgt abonnieren:

mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"

Und wir können mitmosquitto_pub veröffentlichen:

mosquitto_pub -h localhost -t test -m "hello world" -u "your-user" -P "your-password"

Gehen Sie wie folgt vor, um ein Abonnement mit dem gesicherten Listener auf Port 8883 durchzuführen:

mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

Und so veröffentlichen Sie für den gesicherten Listener:

mosquitto_pub -h mqtt.example.com -t test -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

Beachten Sie, dass wir den vollständigen Hostnamen anstelle vonlocalhost verwenden. Da unser SSL-Zertifikat fürmqtt.example.com ausgestellt wird, wird beim Versuch, eine sichere Verbindung zulocalhost herzustellen, eine Fehlermeldung angezeigt, dass der Hostname nicht mit dem Hostnamen des Zertifikats übereinstimmt.

Zum Testen der Websocket-Funktionalität verwenden wir einen öffentlichen, browserbasierten MQTT-Client. Open the Eclipse Paho javascript client utility in your browser und füllen Sie die Verbindungsinformationen wie folgt aus:

  • Host ist die Domain für Ihren Mosquitto-Server,mqtt.example.com

  • Port ist8083

  • ClientId kann dem standardmäßigen zufälligen Wert überlassen werden

  • Path kann auf den Standardwert von/ws belassen werden

  • Username ist Ihr Mosquitto-Benutzername aus Schritt 3

  • Password ist das Passwort, das Sie in Schritt 3 gewählt haben

Die übrigen Felder können auf ihren Standardwerten belassen werden.

Nach dem Drücken vonConnect stellt der Client eine Verbindung zu Ihrem Server her. Sie können veröffentlichen und abonnieren, indem Sie die BereicheSubscribe undPublish Message unterhalb des BereichsConnection verwenden.

Fazit

Wir haben jetzt einen sicheren, kennwortgeschützten und SSL-verschlüsselten MQTT-Server eingerichtet und getestet. Dies kann als robuste und sichere Messaging-Plattform für Ihr IoT, Ihre Heimautomation oder andere Projekte dienen.