Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Následující verze | Předchozí verze | ||
majordomus:mosquitto [2024/10/20 14:36] – vytvořeno Petr Nosek | majordomus:mosquitto [2024/11/24 09:30] (aktuální) – [Vygenerování self-signed certifikátů] Petr Nosek | ||
---|---|---|---|
Řádek 36: | Řádek 36: | ||
</ | </ | ||
- | <adm warning> | + | <adm warning> |
+ | ===== 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:// | ||
+ | |||
+ | |||
+ | 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í, | ||
+ | |||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | IP=" | ||
+ | COUNTRY=" | ||
+ | STATE=" | ||
+ | LOCALITY=" | ||
+ | ORG=" | ||
+ | |||
+ | SUBJECT_BASE="/ | ||
+ | SUBJECT_CA=" | ||
+ | SUBJECT_SERVER=" | ||
+ | SUBJECT_CLIENT=" | ||
+ | |||
+ | # Vytvořte konfigurační soubor san.cnf pro zahrnutí SAN | ||
+ | cat > san.cnf <<EOF | ||
+ | [ req ] | ||
+ | default_bits | ||
+ | distinguished_name = req_distinguished_name | ||
+ | req_extensions | ||
+ | |||
+ | [ req_distinguished_name ] | ||
+ | countryName | ||
+ | countryName_default | ||
+ | stateOrProvinceName | ||
+ | stateOrProvinceName_default = $STATE | ||
+ | localityName | ||
+ | localityName_default | ||
+ | organizationName | ||
+ | organizationName_default | ||
+ | commonName | ||
+ | commonName_default | ||
+ | |||
+ | [ req_ext ] | ||
+ | subjectAltName = @alt_names | ||
+ | |||
+ | [ alt_names ] | ||
+ | IP.1 = $IP | ||
+ | EOF | ||
+ | |||
+ | function generate_CA () { | ||
+ | echo " | ||
+ | | ||
+ | } | ||
+ | |||
+ | function generate_server () { | ||
+ | echo " | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | function generate_client () { | ||
+ | echo " | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | 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ě // | ||
+ | |||
+ | 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 // | ||
+ | |||
+ | Ve složce je také umístěný konfigurační soubor // | ||
+ | |||
+ | < | ||
+ | listener 8883 | ||
+ | |||
+ | # persistence enabled for remembering retain flag across restarts | ||
+ | # | ||
+ | persistence true | ||
+ | persistence_location / | ||
+ | |||
+ | # logging options: | ||
+ | # | ||
+ | # logs do not persist across restarts) | ||
+ | #log_dest file / | ||
+ | log_dest stdout | ||
+ | log_timestamp_format %Y-%m-%dT%H: | ||
+ | #log_type all | ||
+ | |||
+ | # password handling: | ||
+ | # | ||
+ | # open access | ||
+ | # | ||
+ | # no access | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # no access without passwords | ||
+ | # | ||
+ | # | ||
+ | password_file / | ||
+ | allow_anonymous false | ||
+ | |||
+ | # certificates | ||
+ | cafile / | ||
+ | certfile / | ||
+ | keyfile / | ||
+ | |||
+ | # | ||
+ | |||
+ | # Uncomment to enable filters | ||
+ | #acl_file / | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ==== 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 / | ||
+ | allow_anonymous false | ||
+ | </ | ||
+ | |||
+ | Nastavení cest k certifikátům (cesta reflektuje, že Mosquitto poběží v Dockeru): | ||
+ | |||
+ | < | ||
+ | cafile / | ||
+ | certfile / | ||
+ | keyfile / | ||
+ | </ | ||
+ | |||
+ | 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. | ||
+ | |||
+ | < | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Vygenerování uživatele a hesla do pwfile ===== | ||
+ | |||
+ | Připojíme do kontejneru s Mosquitto a vytvořím uživatele s heslem: | ||
+ | |||
+ | <code bash> | ||
+ | docker exec -it mosquitto sh | ||
+ | mosquitto_passwd -c / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Ověření funkčnosti ===== | ||
+ | |||
+ | Pokud vše proběhlo správně, tak takto se připojíme na nějaký topic: | ||
+ | |||
+ | <code bash> | ||
+ | mosquitto_sub -u majordomus --pw ' | ||
+ | </ | ||
+ | |||
+ | pro zapisování: | ||
+ | |||
+ | <code bash> | ||
+ | mosquitto_pub -u majordomus --pw ' | ||
+ | </ |