Linux: Mosquitto MQTT Broker TLS/SSL installieren/einrichten

Hinweis: Wir haben in diesem Artikel möglicherweise Provisions-Links verwendet und sie durch (*) gekennzeichnet. Erfolgt über diese Links eine Bestellung, erhält maffert.net eine Provision. Es entstehen für Sie keine Nachteile beim Kauf oder Preis.

Da inzwischen auch eine gewisse Sicherheit innerhalb des eigenen Netzwerks nicht schadet, beschreibe ich hier die Vorgehensweise wie ihr euren Mosquitto MQTT Broker mit TLS/SSL startklar macht.

1 . Das Zertifikat bereitstellen:

1.1 – Für öffentlich erreichbare Server:
Certbot installieren:
apt install snapd
snap install core; snap refresh core
snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Zertifikat erstellen bzw. anfordern:
Methode wählen:

1: Standalone Methode (wichtig Port 80 muss offen sein, es muss kein extra Webserver installiert werden!):
certbot certonly --standalone --key-type rsa --rsa-key-size 2048 -d mqtt.maffert.net

2: Webserver Methode (es wird der aktuelle Webserver genutzt):
certbot certonly --manual --preferred-challenge http -d mqtt.maffert.net

certbot certonly --manual --key-type rsa --rsa-key-size 2048 --preferred-challenge http -d mqtt.maffert.net

3: DNS Methode (Wildcard - TXT Eintrag muss alle 3 Monate geändert werden):
certbot certonly --manual --preferred-challenge dns -d *.maffert.net

Nach erfolgreier Ausstellung der Zertifkate, bekommt ihr die Pfade angezeigt, wo die Dateien gespeichert sind:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mqtt.maffert.net/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/mqtt.maffert.net/privkey.pem
Konfigurieren das Letsencrypt beim automatischen Zerti Austausch die Dateien passend in „/etc/mosquitto/certs“ kopiert, die Berechtigung anpasst und mosquitto neu lädt:
nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

######### INHALT #########

#!/bin/sh

# This is an example deploy renewal hook for certbot that copies newly updated
# certificates to the Mosquitto certificates directory and sets the ownership
# and permissions so only the mosquitto user can access them, then signals
# Mosquitto to reload certificates.

# RENEWED_DOMAINS will match the domains being renewed for that certificate, so
# may be just "example.com", or multiple domains "www.example.com example.com"
# depending on your certificate.

# Place this script in /etc/letsencrypt/renewal-hooks/deploy/ and make it
# executable after editing it to your needs.

# Set which domain this script will be run for
MY_DOMAIN=mqtt.maffert.net
# Set the directory that the certificates will be copied to.
CERTIFICATE_DIR=/etc/mosquitto/certs

for D in ${RENEWED_DOMAINS}; do
        if [ "${D}" = "${MY_DOMAIN}" ]; then
                # Copy new certificate to Mosquitto directory
                cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem
                cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key

                # Set ownership to Mosquitto
                chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

                # Ensure permissions are restrictive
                chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

                # Tell Mosquitto to reload certificates and configuration
                pkill -HUP -x mosquitto
        fi
done

######### INHALT ENDE #########

Berechtigung für das Skript anpassen:
chmod a+x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Testen ob es klappt:
sudo certbot renew --force-renewal

Wenn es nicht sofort funktioniert, dann einmal neu starten:
systemctl restart mosquitto.service
1.2 – Für den Server im eigenem Netzwerk:
Prüfen ob der Hostname richtig gesetzt wurde:
hostname -f
wenn nicht, dann passend setzen:
hostnamectl set-hostname openhab.fritz.box
nano /etc/hosts
192.168.40.100  openhab.fritz.box
systemctl restart networking.service
CA, Zertifikate und Keys mit dem offiziellen Skript passend erstellen:
cd /etc/mosquitto/certs
wget https://raw.githubusercontent.com/owntracks/tools/master/TLS/generate-CA.sh -O - | sudo bash

2. – Die Mosquitto Konfigurationsdatei anpassen:

nano /etc/mosquitto/conf.d/secure.conf

# MQTT
listener 1883

# MQTT TLS/SSL
listener 8883
protocol mqtt
tls_version tlsv1.2
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/shome.shome.internal.crt
keyfile /etc/mosquitto/certs/shome.shome.internal.key
require_certificate false

3. – Berechtigung anpassen (ggf. vorher das Paket acl installieren):

apt-get install acl
setfacl -R -m u:mosquitto:rX /etc/mosquitto/certs/

4. – Mosquitto neu starten und prüfen ob es läuft:

systemctl restart mosquitto.service
systemctl status mosquitto.service
netstat -tulpen | grep 8883

Nützliche Infos:

Wie man Tasmota mit TLS bestückt bzw. was man ggf. beachten muss, habe ich hier beschrieben: https://www.maffert.net/tasmota-mqtt-tls-flashen-aktivieren-nous-a1t/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert