Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
it:iot:mosquitto [2023/01/04 14:41] – Petr Nosek | it:iot:mosquitto [2023/02/12 08:49] (aktuální) – [Zapnutí autentizace] Petr Nosek | ||
---|---|---|---|
Řádek 7: | Řádek 7: | ||
- | ==== Zabezpečení Mosquitto v Dockeru ==== | ||
- | === Zapnutí autentizace === | + | ===== Podrobnější logování v Mosquitto |
+ | Do konfiguračního souboru lze [[https:// | ||
+ | |||
+ | <code bash> | ||
+ | # Types of messages to log. Use multiple log_type lines for logging | ||
+ | # multiple types of messages. | ||
+ | # Possible types are: debug, error, warning, notice, information, | ||
+ | # none, subscribe, unsubscribe, | ||
+ | # Note that debug type messages are for decoding the incoming/ | ||
+ | # network packets. They are not logged in " | ||
+ | log_type error | ||
+ | log_type warning | ||
+ | log_type notice | ||
+ | log_type information | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Zabezpečení Mosquitto v Dockeru ===== | ||
+ | |||
+ | ==== Zapnutí autentizace | ||
- | Vycházím z návodu [[https:// | + | Vycházím z návodu [[https:// |
V konfiguračním souboru mosquitto.conf nastavím/ | V konfiguračním souboru mosquitto.conf nastavím/ | ||
Řádek 23: | Řádek 42: | ||
<code bash> | <code bash> | ||
- | docker exec -it mosqutto | + | docker exec -it mosquitto |
mosquitto_passwd -c / | mosquitto_passwd -c / | ||
</ | </ | ||
Řádek 29: | Řádek 48: | ||
Nakonec retartovat kontejner s Mosquitto. | Nakonec retartovat kontejner s Mosquitto. | ||
+ | Příkaz pro čtení s autentizací: | ||
- | * https:// | + | <code bash> |
- | * https:// | + | $ mosquitto_sub |
- | * https:// | + | </code> |
- | * https:// | + | |
+ | Příkaz pro publikaci s autentizací: | ||
- | === Podrobnější logování v Mosquitto | + | <code bash> |
- | Do konfiguračního souboru lze [[https://iot.stackexchange.com/questions/956/how-to-enable-detailed-logging-of-mosquitto-broker-on-windows-7|dle zdroje]] přidat tyto řádky: | + | $ mosquitto_pub -u henry -P ' |
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Zapnutí komunikace přes SSL ==== | ||
+ | |||
+ | Nejprve jsem postupoval podle návodu | ||
+ | |Secure MQTT broker (TLS) and Docker Compose]]. | ||
+ | |||
+ | Jako první jsem použil tento skript pro vygenerování certifikátů: | ||
<code bash> | <code bash> | ||
- | # Types of messages to log. Use multiple log_type lines for logging | + | #!/bin/bash |
- | # multiple types of messages. | + | |
- | # Possible types are: debug, error, warning, notice, information, | + | IP=" |
- | # none, subscribe, unsubscribe, | + | SUBJECT_CA="/ |
- | # Note that debug type messages are for decoding the incoming/ | + | SUBJECT_SERVER="/ |
- | # network packets. They are not logged | + | SUBJECT_CLIENT="/ |
- | log_type error | + | |
- | log_type warning | + | function generate_CA () { |
- | log_type notice | + | echo " |
- | log_type information | + | |
+ | } | ||
+ | |||
+ | function generate_server () { | ||
+ | echo " | ||
+ | | ||
+ | openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 | ||
+ | } | ||
+ | |||
+ | function generate_client () { | ||
+ | echo " | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | function generate_der () { | ||
+ | echo " | ||
+ | openssl x509 -in client.crt -out cert.der -outform DER | ||
+ | | ||
+ | } | ||
+ | |||
+ | function generate_server_pem () { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | generate_CA | ||
+ | generate_server | ||
+ | generate_client | ||
+ | generate_der | ||
+ | generate_server_pem | ||
</ | </ | ||
+ | |||
+ | Kód jsem si trochu upravil. Určitě je potřeba tam dát IP adresu zařízení serveru a dále jsem změnil to, že certifikáty se vygenerují s platností na delší dobu než 365 dní. | ||
+ | |||
+ | **Dále jsem přidal kód pro vygenerování DER certifikátů serveru kvůli ESP8266.** V [[https:// | ||
+ | |||
+ | |||
+ | V dalším kroku jsem nahrál soubory ca.crt, server.crt a server.key do konfigurační složky mosquitto a nastavil konfigurační soubor: | ||
+ | |||
+ | < | ||
+ | cafile / | ||
+ | certfile / | ||
+ | keyfile / | ||
+ | |||
+ | require_certificate true | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | Parametr **use_identity_as_username** jsem zakomentoval. Pokud by byl aktivní, tak by nebylo potřeba používat přihlašovací jméno a heslo. Stačil by pouze klientský certifikát. Ale takové použití mi nevyhovuje a nevím, jestli by to nedělalo s ESP8266 problém, když klientský certifikát nevyužívá. | ||
+ | |||
+ | Jako poslední jsem upravil port, na kterém mosquitto běží, protože zabezpečené připojení se očekává na portu 8883. | ||
+ | |||
+ | < | ||
+ | listener 8883 | ||
+ | </ | ||
+ | |||
+ | |||
+ | V dalším kroku jsem ještě editoval **docker-compose.yml** a změnil port pro mosquitto také: | ||
+ | |||
+ | < | ||
+ | | ||
+ | - " | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | docker-compose up -d | ||
+ | </ | ||
+ | |||
+ | |||
+ | Pro otestování zabezpečeného připojení mi pomohl [[https:// | ||
+ | |||
+ | <code bash> | ||
+ | mosquitto_sub -h 192.168.1.22 -u ' | ||
+ | Client (null) sending CONNECT | ||
+ | Client (null) received CONNACK (0) | ||
+ | Client (null) sending SUBSCRIBE (Mid: 1, Topic: dum/ | ||
+ | Client (null) received SUBACK | ||
+ | Subscribed (mid: 1): 0 | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | === ESP8266, microPython a Mosquito přes SSL === | ||
+ | |||
+ | Po dlouhém bádání jsem se dopracoval k tomu, že je potřeba certifikát v binárním formátu DER. Nainstaloval jsem si mpfshell a nahrál do ESP8266 vygenerované certifikáty **cert.der** a **key.der**. Ještě je dobré si uvědomit, že by nemělo být připojeno nic jiného k portu s ESP8266, jinak to nebude fungovat. | ||
+ | |||
+ | <code bash> | ||
+ | sudo pip3 install mpfshell | ||
+ | mpfshell -c "open ttyUSB0" | ||
+ | ls | ||
+ | put cert.der | ||
+ | put key.der | ||
+ | ls | ||
+ | </ | ||
+ | |||
+ | |||
+ | Pak jsem musel upravid kód v microPythonu, | ||
+ | |||
+ | <code python> | ||
+ | with open(" | ||
+ | key = f.read() | ||
+ | | ||
+ | with open(" | ||
+ | cert = f.read() | ||
+ | |||
+ | |||
+ | ssl_params = dict() | ||
+ | ssl_params[" | ||
+ | ssl_params[" | ||
+ | |||
+ | |||
+ | mqttc = MQTTClient(CLIENT_NAME, | ||
+ | | ||
+ | </ | ||
+ | |||
+ | zdroje, ze kterých jsem čerpal: | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ |