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/