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.
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 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
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
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