MQTT Absichern durch ein selbst signierten Zertifikats für Mosquitto
Zur Navigation springen
Zur Suche springen
Erstellung eines selbst signierten Zertifikats für Mosquitto
- mkdir ca
- cd ca
CA-Schlüssel und Zertifikat erstellen
- openssl genrsa -out ca.key 2048
- openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
Mosquitto-Schlüssel und Zertifikat erstellen
- openssl genrsa -out mqtt.lab.int.key 2048
- openssl req -new -key mqtt.lab.int.key -out mqtt.lab.int.csr
- openssl x509 -req -in mqtt.lab.int.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out mqtt.lab.int.crt -days 1825 -sha256
Kopiere der Dateien
- cp ca.crt mqtt.lab.int.crt mqtt.lab.int.key /etc/mosquitto
- cd /etc/mosquitto
- chown -R mosquitto:mosquitto ca.crt mqtt.lab.int.crt mqtt.lab.int.key
Mosquitto-Konfiguration anpassen
Öffne die Konfigurationsdatei von Mosquitto:
- sudo vi /etc/mosquitto/conf.d/default.conf
Füge folgende Zeilen hinzu:
listener 8883 0.0.0.0 password_file /etc/mosquitto/passwd allow_anonymous false cafile /etc/mosquitto/ca.crt certfile /etc/mosquitto/mqtt.lab.int.crt keyfile /etc/mosquitto/mqtt.lab.int.key require_certificate false
Starte den Mosquitto-Dienst neu:
- sudo systemctl restart mosquitto
CA-Zertifikat auf die Clients ausrollen
Kopiere das CA-Zertifikat (ca.crt) auf die Clients, damit sie der Verbindung vertrauen können.
MQTT-Nachrichten senden mit Zertifikat
- export MQTTSERVER=mqtt.lab.int
Licht im Wohnzimmer einschalten
- mosquitto_pub -h $MQTTSERVER -t home/wohnzimmer/status -m "on" -u xinux -P geheim --cafile ca.crt -p 8883
Licht im Wohnzimmer ausschalten
- mosquitto_pub -h $MQTTSERVER -t home/wohnzimmer/status -m "off" -u xinux -P geheim --cafile ca.crt -p 8883
Zusammenfassung
Erstelle eine CA, um dein Mosquitto-Zertifikat zu signieren, und verteile das CA-Zertifikat auf die Clients, um eine verschlüsselte und vertrauenswürdige Verbindung zu gewährleisten.
Konfiguration des Node.js-Servers
Erstelle die Datei server.js im Verzeichnis home-control mit folgendem Inhalt:
const mqtt = require('mqtt');
const fs = require('fs');
const express = require('express');
const path = require('path');
const app = express();
const port = 3000;
let status = {
wohnzimmer: 'off',
schlafzimmer: 'off',
kueche: 'off',
haustuer: 'geschlossen'
};
// MQTT-Verbindung herstellen über TLS
const options = {
port: 8883,
host: 'mqtt.lab.int',
protocol: 'mqtts',
username: 'xinux',
password: 'geheim',
ca: fs.readFileSync(./ca.crt') // Pfad zur ca.crt
};
const client = mqtt.connect(options);
client.on('connect', () => {
console.log('Verbunden mit dem Broker');
client.subscribe('home/+/status', (err) => {
if (!err) {
console.log('Alle Topics abonniert');
}
});
});
client.on('message', (topic, message) => {
const room = topic.split('/')[1];
status[room] = message.toString();
console.log(`Status von ${room}: ${status[room]}`);
});
// API-Route für den Status der Lichter und Haustür
app.get('/status', (req, res) => {
res.send(status);
});
// Statisches Verzeichnis für die Webseite
app.use(express.static(path.join(__dirname)));
// Starte den Webserver
app.listen(port, () => {
console.log(`Webserver läuft auf http://localhost:${port}`);
});
Anpassungen
- Die **MQTT-Verbindung** verwendet jetzt **Port 8883** und das Protokoll **mqtts** (verschlüsselt). - Der Pfad zur **ca.crt** liegt unter **/root/home-control/ca.crt**.