MQTT Absichern durch ein selbst signierten Zertifikats für Mosquitto

Aus Xinux Wiki
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**.