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.