majordomus:mosquitto

Toto je starší verze dokumentu!


Mosquitto

Instalaci Mosquitto jsem provedl skrz Docker. Tady je docker-compose.yml:

version: '3.6'

networks:
  default:
    driver: bridge
    ipam:
      driver: default
  nextcloud:
    driver: bridge
    internal: true
    ipam:
      driver: default

services:
  mosquitto:
    container_name: mosquitto
    build:
      context: ./.templates/mosquitto/.
      args:
      - MOSQUITTO_BASE=eclipse-mosquitto:latest
    restart: unless-stopped
    environment:
    - TZ=${TZ:-Etc/UTC}
    ports:
    - "8883:8883"
    volumes:
    - ./volumes/mosquitto/config:/mosquitto/config
    - ./volumes/mosquitto/data:/mosquitto/data
    - ./volumes/mosquitto/log:/mosquitto/log
    - ./volumes/mosquitto/pwfile:/mosquitto/pwfile

Warning

V rámci instalace řeším rovnou SSL certifikáty a tomu odpovídá i porty v docker-compose.yml. Pokud bych chtěl nainstalovat verzi bez SSL, tak volím porty 1883:1883.

Protože budu Mosquitto provozovat pouze v domácí síti, budu potřebovat self signed certifikát. Podrobnosti jsem rozepsal zde, nicméně omezím se nyní na postup pouze pro náš účel.

K vytvoření nezbytných certifikátů pomůže tento skript, ve kterém je potřeba změnit IP adresu na IP adresu zařízení, na kterém MQTT server Mosquitto poběží.

#!/bin/bash
 
IP="192.168.1.22"
SUBJECT_CA="/C=CZ/ST=Brno/L=Brno/O=majordomus/OU=CA/CN=$IP"
SUBJECT_SERVER="/C=CZ/ST=Brno/L=Brno/O=majordomus/OU=Server/CN=$IP"
SUBJECT_CLIENT="/C=CZ/ST=Brno/L=Brno/O=majordomus/OU=Client/CN=$IP"
 
function generate_CA () {
   echo "$SUBJECT_CA"
   openssl req -x509 -nodes -sha256 -newkey rsa:2048 -subj "$SUBJECT_CA"  -days 3650 -keyout ca.key -out ca.crt
}
 
function generate_server () {
   echo "$SUBJECT_SERVER"
   openssl req -nodes -sha256 -new -subj "$SUBJECT_SERVER" -keyout server.key -out server.csr
   openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
}
 
generate_CA
generate_server

Platnost certifikátu jsem raději nastavil na 10 let. Po spuštění kódu budu mít ve více souborů. Nicméně pro MQTT server Mosquitto budu potřebovat:

  • ca.crt
  • server.crt
  • server.key

Pro klienta (aby se připojil k MQTT serveru) mi bude stačit soubor:

  • ca.crt

Podle docker file je konfigurační soubor umístěn v cestě ./volumes/mosquitto/config

Do této složky nahrajeme tedy vygenerované certifikáty:

  • ca.crt
  • server.crt
  • server.key

Ve složce je také umístěný konfigurační soubor mosquitto.conf. Ten upravíme, aby povolil SSL a bude vypadat takto:

listener 8883

# persistence enabled for remembering retain flag across restarts
#
persistence true
persistence_location /mosquitto/data

# logging options:
#   enable one of the following (stdout = less wear on SD cards but
#   logs do not persist across restarts)
#log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
log_timestamp_format %Y-%m-%dT%H:%M:%S
#log_type all

# password handling:
#   password_file commented-out allow_anonymous true =
#     open access
#   password_file commented-out allow_anonymous false =
#     no access
#   password_file activated     allow_anonymous true =
#     passwords omitted is permitted but
#     passwords provided must match pwfile
#   password_file activated     allow_anonymous false =
#     no access without passwords
#     passwords provided must match pwfile
#
password_file /mosquitto/pwfile/pwfile
allow_anonymous false

# certificates                       
cafile /mosquitto/config/ca.crt
certfile /mosquitto/config/server.crt
keyfile /mosquitto/config/server.key

#require_certificate true

# Uncomment to enable filters
#acl_file /mosquitto/config/filter.acl

Změna portu, na kterém Mosquitto běží:

listener 8883

Zapnutí souboru, ve kterém budou přihlašovací jména a hesla (vygenerujeme později) a zakázání anonymního připojení.

password_file /mosquitto/pwfile/pwfile
allow_anonymous false

Nastavení cest k certifikátům (cesta reflektuje, že Mosquitto poběží v Dockeru):

cafile /mosquitto/config/ca.crt
certfile /mosquitto/config/server.crt
keyfile /mosquitto/config/server.key

Nebudeme vyžadovat, aby se klient přihlašoval svým certifikátem - museli bychom totiž vygenerovat ještě certifikáty pro klienty a zároveň bychom mohli vypnout přihlašování jménem a heslem. Takže tuto položku mějme zakomentovanou nebo nastavenou na false.

#require_certificate true
  • majordomus/mosquitto.1729436154.txt.gz
  • Poslední úprava: 2024/10/20 14:55
  • autor: Petr Nosek