Hintergrund

Im Artikel MQTT mit SSL habe ich bereits beschrieben, wie man den freien MQTT Broker mosquitto mit SSL-Zertifikaten von Let's Encrypt absichern kann. Hierbei war mosquitto bisher nur für Zugriffe über das MQTT-Protokoll konfiguriert.

Die Idee

Für manche Anwendungszwecke wäre es sinnvoll, wenn man auch über (sichere) Websockets auf den MQTT-Broker zugreifen könnte. Gut, dass mosquitto auch dieses Protokoll seit einigen Versionen unterstützt.
Wenn man mosquitto auf dem Raspberry oder unter älteren Linux-Versionen einsetzt, muss man zuvor prüfen, ob die Version tatsächlich bereits Websockets unterstützt und ggf. eine passende Version manuell kompilieren und installieren.

Vorab zu tun

Ich gehe an dieser Stelle davon aus, dass Let's Encrypt und mosquitto wie im Artikel über MQTT mit SSL eingerichtet sind.

Konfiguration erneut anpassen

Dateien zusammenführen

Bisher war die Port-Angabe in der Konfigurationsdatei /etc/mosquitto/conf.d/base.conf über port 8883 angegeben und die SSL-Konfiguration in der separaten Datei /etc/mosquitto/conf.d/ssl.conf angegeben.

Dies sollte zur Vereinfachung so angepasst werden, dass die Inhalte der relevanten Konfigurationsdateien in einer gemeinsamen Datei zusammengefasst und die einzelnen Dateien gelöscht werden. Die Datei user-restriction.conf kann dabei wie bisher beibehalten werden, da diese weiterhin sowohl für MQTT als auch für Websockets gilt.

Ports, Protokolle und SSL anpassen

Statt der bisherigen Angabe von port werden nun stattdessen zwei Listener konfiguriert und diese bekommen beide jeweils die SSL-Konfiguration zugeordnet. Wenn man bei einem Listener keine Zertifikate angibt, erfolgt hierfür dann auch keine SSL-Verschlüsselung. Falls benötigt, kann man parallel zu den SSL-Listenern auch noch unverschlüsselte Listener hinzufügen, allerdings sollte man bei diesen prüfen, ob man tatsächlich eine unverschlüsselte Kommunikation von aussen zulassen möchte. Im Übrigen kann man beim listener nach dem Port auch noch eine IP (z.B. 127.0.0.1) angeben.

Wenn man die Einstellungen zusammengefasst hat, sollte die Konfigurationsdatei ungefähr so aussehen:

listener 8883
protocol mqtt
cafile /etc/ssl/certs/DST_Root_CA_X3.pem
certfile /etc/letsencrypt/live/your_domain/fullchain.pem
keyfile /etc/letsencrypt/live/your_domain/privkey.pem

listener 8884
protocol websockets
cafile /etc/ssl/certs/DST_Root_CA_X3.pem
certfile /etc/letsencrypt/live/your_domain/fullchain.pem
keyfile /etc/letsencrypt/live/your_domain/privkey.pem

Danach startet man den mosquitto Dienst einmal komplett neu, da die listener Angaben bei einem Reload nicht neu initialisiert werden. Wenn alles funktioniert hat, steht der MQTT-Broker nun auch via wss://your_domain:8884 zur Verfügung.

Tipp zu SSL mit Let's Encrypt

Wie bereits im anderen Artikel beschrieben, muss mosquitto neu gestartet werden, wenn sich die SSL-Zertifikate ändern, also erneuert werden. Hierbei kann es hilfreich sein, wenn man dies entweder über den post-hook des Certbot von Let's Encrypt konfiguriert oder in seinem eigenen Shell-Skript vorsieht, das man per cron aufrufen lässt.

Artikel

Allgemeiner Disclaimer

Alle Angaben in diesem Text sind sorgfältig zusammengestellt und für einige Szenarien getestet worden. Trotzdem sind Fehler nicht auszuschliessen. Die Anwendung des Beschriebenen erfolgt deshalb immer auf eigene Gefahr.

Zusatzinfos
Navigation