it:iot:mosquitto

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
it:iot:mosquitto [2023/01/04 14:52] Petr Nosekit: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://iot.stackexchange.com/questions/956/how-to-enable-detailed-logging-of-mosquitto-broker-on-windows-7|dle zdroje]] přidat tyto řádky: 
 + 
 +<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, websockets, all. 
 +# Note that debug type messages are for decoding the incoming/outgoing 
 +# network packets. They are not logged in "topics"
 +log_type error 
 +log_type warning 
 +log_type notice 
 +log_type information 
 +</code> 
 + 
 + 
 + 
 +===== Zabezpečení Mosquitto v Dockeru ===== 
 + 
 +==== Zapnutí autentizace ====
  
 Vycházím z návodu [[https://www.homeautomationguy.io/docker-tips/configuring-the-mosquitto-mqtt-docker-container-for-use-with-home-assistant/|Configuring the Mosquitto MQTT Docker container for use with Home Assistant]], který popisuje zapnutí autentizace pro Mosquitto. Další informace jsem pak čerpal z tohoto článku: [[https://techsparx.com/software-development/mqtt/mosquitto-docker.html|Deploying Mosquitto MQTT broker on Linux using Docker ]] Vycházím z návodu [[https://www.homeautomationguy.io/docker-tips/configuring-the-mosquitto-mqtt-docker-container-for-use-with-home-assistant/|Configuring the Mosquitto MQTT Docker container for use with Home Assistant]], který popisuje zapnutí autentizace pro Mosquitto. Další informace jsem pak čerpal z tohoto článku: [[https://techsparx.com/software-development/mqtt/mosquitto-docker.html|Deploying Mosquitto MQTT broker on Linux using Docker ]]
Řádek 23: Řádek 42:
  
 <code bash> <code bash>
-docker exec -it mosqutto sh+docker exec -it mosquitto sh
 mosquitto_passwd -c /mosquitto/pwfile/pwfile majordomus mosquitto_passwd -c /mosquitto/pwfile/pwfile majordomus
 </code> </code>
Řádek 32: Řádek 51:
  
 <code bash> <code bash>
-$ mosquitto_sub -u henry --pw passw0rd -h localhost -p 1883 -v -t test/message+$ mosquitto_sub -u henry --pw 'passw0rd-h localhost -p 1883 -v -t test/message
 </code> </code>
  
-Příkaz pro publikaci s autenizací:+Příkaz pro publikaci s autentizací:
  
 <code bash> <code bash>
-$ mosquitto_pub -u henry -P passw0rd -h localhost -p 1883 -t test/message -m 'Hello World!'+$ mosquitto_pub -u henry -P 'passw0rd-h localhost -p 1883 -t test/message -m 'Hello World!'
 </code> </code>
  
-  * https://medium.com/himinds/mqtt-broker-with-secure-tls-communication-on-ubuntu-18-04-lts-and-an-esp32-mqtt-client-5c25fd7afe67 
-  * https://medium.com/himinds/mqtt-broker-with-secure-tls-and-docker-compose-708a6f483c92 
  
  
  
-=== Podrobnější logování v Mosquitto  === +==== Zapnutí komunikace přes SSL ==== 
-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:+ 
 +Nejprve jsem postupoval podle návodu [[https://medium.com/himinds/mqtt-broker-with-secure-tls-and-docker-compose-708a6f483c92 
 +|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 aredebug, error, warning, notice, information,  +IP="192.168.1.22" 
-# none, subscribe, unsubscribe, websockets, all+SUBJECT_CA="/C=CZ/ST=Brno/L=Brno/O=majordomus/OU=CA/CN=$IP" 
-# Note that debug type messages are for decoding the incoming/outgoing +SUBJECT_SERVER="/C=CZ/ST=Brno/L=Brno/O=majordomus/OU=Server/CN=$IP" 
-# network packetsThey are not logged in "topics". +SUBJECT_CLIENT="/C=CZ/ST=Brno/L=Brno/O=majordomus/OU=Client/CN=$IP" 
-log_type error + 
-log_type warning +function generate_CA () { 
-log_type notice +   echo "$SUBJECT_CA" 
-log_type information+   openssl req -x509 -nodes -sha256 -newkey rsa:2048 -subj "$SUBJECT_CA"  -days 365 -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 365 
 +
 + 
 +function generate_client () { 
 +   echo "$SUBJECT_CLIENT" 
 +   openssl req -new -nodes -sha256 -subj "$SUBJECT_CLIENT" -out client.csr -keyout client.key  
 +   openssl x509 -req -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 
 +
 + 
 + 
 +function generate_der () { 
 +   echo "generate DER certificates for ESP8266" 
 +   openssl x509 -in client.crt -out cert.der -outform DER 
 +   openssl rsa -in client.key -out key.der -outform DER 
 +
 + 
 +function generate_server_pem () { 
 +   echo "generate PEM certificates for Node RED" 
 +   openssl x509 -in server.crt -out server-cert.pem 
 +   openssl rsa -in server.key -out server-key.pem 
 +
 + 
 + 
 +generate_CA 
 +generate_server 
 +generate_client 
 +generate_der 
 +generate_server_pem
 </code> </code>
 +
 +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://serverfault.com/questions/1006639/create-der-certificatekey-from-pem|diskusi]] jsem se dočetl, že DER je binární formát a ten právě potřebuje ESP8266.
 +
 +
 +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:
 +
 +<code>
 +cafile /mosquitto/config/ca.crt
 +certfile /mosquitto/config/server.crt
 +keyfile /mosquitto/config/server.key
 +
 +require_certificate true
 +#use_identity_as_username true
 +</code>
 +
 +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.
 +
 +<code>
 +listener 8883
 +</code>
 +
 +
 +V dalším kroku jsem ještě editoval **docker-compose.yml** a změnil port pro mosquitto také:
 +
 +<code>
 +   ports:
 +   - "8883:8883"
 +</code>
 +
 +<code bash>
 +docker-compose up -d
 +</code>
 +
 +
 +Pro otestování zabezpečeného připojení mi pomohl [[https://medium.com/himinds/mqtt-broker-with-secure-tls-communication-on-ubuntu-18-04-lts-and-an-esp32-mqtt-client-5c25fd7afe67|tento návod]].
 +
 +<code bash>
 +mosquitto_sub -h 192.168.1.22 -u 'majordomus' --pw 'supertajneheslo' -t 'dum/pracovna/vlhkost' -p 8883 -d --cafile ca.crt --cert client.crt --key client.key
 +Client (null) sending CONNECT
 +Client (null) received CONNACK (0)
 +Client (null) sending SUBSCRIBE (Mid: 1, Topic: dum/pracovna/vlhkost, QoS: 0, Options: 0x00)
 +Client (null) received SUBACK
 +Subscribed (mid: 1): 0
 +
 +</code>
 +
 +
 +=== 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
 +</code>
 +
 +
 +Pak jsem musel upravid kód v microPythonu, aby načetl certifikáty a použil je při autentizaci.
 +
 +<code python>
 +with open("key.der", 'rb') as f:
 +            key = f.read()
 +            
 +with open("cert.der", 'rb') as f:
 +            cert = f.read()
 +
 +
 +ssl_params = dict()
 +ssl_params["cert"] = cert
 +ssl_params["key"] = key
 +
 +
 +mqttc = MQTTClient(CLIENT_NAME, BROKER_ADDR, 8883, USER, PASSWORD, ssl=True, ssl_params=ssl_params, keepalive=60)
 +    
 +</code>
 +
 +zdroje, ze kterých jsem čerpal:
 +
 +  * https://github.com/peterhinch/micropython-mqtt/issues/10
 +  * https://dev.to/bassparanoya/esp32-micropython-mqtt-tls-28fd
 +  * https://forum.micropython.org/viewtopic.php?f=18&t=11906#p65746
 +  * [[https://forum.pycom.io/topic/4775/solved-mqtt-and-tls|Solved mqtt and tls - ESP32]]
 +  * [[https://microcontrollerslab.com/esp32-esp8266-micropython-mqtt-publish-subscribe-ds18b20-readings/|ESP32 ESP8266 MicroPython MQTT Publish Subscribe DS18B20 Readings]]
 +  * [[https://randomnerdtutorials.com/micropython-mqtt-publish-ds18b10-esp32-esp8266/|MicroPython: MQTT – Publish DS18B20 Temperature Readings (ESP32/ESP8266)]]
 +
 +
 +
  • it/iot/mosquitto.1672843975.txt.gz
  • Poslední úprava: 2023/01/04 14:52
  • autor: Petr Nosek