====== 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
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.
===== Vygenerování self-signed certifikátů =====
Protože budu Mosquitto provozovat pouze v domácí síti, budu potřebovat self signed certifikát. Podrobnosti [[https://wiki.petrnosek.cz/it/iot/mosquitto|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"
COUNTRY="CZ"
STATE="Brno"
LOCALITY="Brno"
ORG="majordomus"
SUBJECT_BASE="/C=$COUNTRY/ST=$STATE/L=$LOCALITY/O=$ORG"
SUBJECT_CA="$SUBJECT_BASE/OU=CA/CN=$IP"
SUBJECT_SERVER="$SUBJECT_BASE/OU=Server/CN=$IP"
SUBJECT_CLIENT="$SUBJECT_BASE/OU=Client/CN=$IP"
# Vytvořte konfigurační soubor san.cnf pro zahrnutí SAN
cat > san.cnf <
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
===== Nastavení konfiguračního souboru Mosquitto =====
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
Dbejme zejména práva k těmto souborům. Nastavit stejně, jako má soubor //mosquitto.conf//. Mosquitto v Dockeru musí mít možnost certifikáty číst.
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
==== Komentář ke konfiguračnímu souboru ====
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
===== Vygenerování uživatele a hesla do pwfile =====
Připojíme do kontejneru s Mosquitto a vytvořím uživatele s heslem:
docker exec -it mosquitto sh
mosquitto_passwd -c /mosquitto/pwfile/pwfile majordomus
===== Ověření funkčnosti =====
Pokud vše proběhlo správně, tak takto se připojíme na nějaký topic:
mosquitto_sub -u majordomus --pw 'passw0rd' -h 192.168.1.22 -p 8883 -v -t majordomus/detskypokojRS/ --cafile ca.crt
pro zapisování:
mosquitto_pub -u majordomus --pw 'passw0rd' -h 192.168.1.22 -p 8883 -v -t majordomus/detskypokojRS/ --cafile ca.crt