Arduino schéma - arduino.sk

Slovenský MQTT Broker - IoT Industries Slovakia II.

Kompletné projekty s návodom a zdrojovým kódom
Príspevky: 84
Registrovaný: Uto 23. Dec 2014 2:15:50

Slovenský MQTT Broker - IoT Industries Slovakia II.

Poslaťod martinius96 » Pia 24. Apr 2020 0:46:26

V minulom článku sme si rozobrali základné pojmy využívané v MQTT, rozobrali sme si metódy Publish / Subscribe. Dnes si ukážeme možnosti šifrovaného spojenia s MQTT Brokerom, ukážeme si pokročilé možnosti metódy Publish.
Obrázok
Predchádzajúca implementácia pre MQTT (nešifrovaný) protokol bola uspôsobená pre platformy Arduino + Ethernet Wiznet W5100 / W5500, ESP32, ESP8266. Nakoľko Arduino nepodporuje šifrované spojenia z hľadiska výkonu a chýbajúcich implementácii, nie je tento mikrokontróler obsiahnutý pre šifrované spojenie s MQTT Brokerom.

MQTTS (Secured MQTT) je port 8883. Tento port sa používa na šifrované spojenie s webserverom. Implementácie pre ESP8266 a ESP32 vyžadujú rozšírenie hlavičkových súborov o WiFiClientSecure.h. Tieto hlavičkové súbory umožňujú vytvoriť spojenie zabezpečeným socketom. ESP32 využíva Root CA certifikát pre šifrované spojenie, ESP8266 vyžaduje SHA1 fingerprint (odtlačok) certifikátu pre spojenie. Štandardne sa používajú pre HTTPS spojenie s webserverom, avšak je ich možné využiť i pre MQTTS.

Root CA certifikát je možné zo vzdialeného MQTT Brokera získať napríklad nástrojom OpenSSL. OpenSSL je kryptografický nástroj (knižnica), ktorý umožňuje široké spektrum operácii. Používa sa predovšetkým pre generovanie certifikátov, ale jeho využitie je možné aj v rôznych programovacích jazykoch.

Prostedníctvom nástroja OpenSSL je možné vypísať si certifikáty, respektíve reťaz dôvernosti - Chain of Trust v súvislosti s danou doménou. MQTT broker beží na doméne mqtt.iotindustries.sk, využijeme port 8883 pre šifrovaný MQTT protokol.
Príkazom: openssl s_client -showcerts -verify 5 -connect mqtt.iotindustries.sk:8883 < /dev/null získame Chain of Trust a môžeme skopírovať a implementovať Root CA (Koreňový certifikát certifikačnej autority) certifikát do programu pre ESP32. Root CA certifikát sa nachádza vo výpise na konci (vypíšu sa 3 certifikáty v .pem resp. .crt formáte).
Obrázok
Platforma ESP8266 vyžaduje implementáciu šifrovaného spojenia prostredníctvom odtlačku certifikátu v SHA1 formáte (hash). Pre získanie odtlačku certifikátu môžeme opäť využiť nástroj OpenSSL a príkazom: openssl s_client -connect mqtt.iotindustries.sk:8883 -showcerts < /dev/null 2>/dev/null | openssl x509 -in /dev/stdin -sha1 -noout -fingerprint získame odtlačok certifikátu v SHA1 formáte. Tento odtlačok je použitý v zdrojovom kóde pre platformu ESP8266.
Obrázok
Testovaný fingerprint bol pod verziou Arduino Core 2.5.0, 2.5.2. Verzie 2.6.X nemusia validne fungovať z dôvodu, že využívajú iný systém pre HTTPS spojenie (nie fingerprint), vyžaduje sa taktiež Root CA certifikát ako u ESP32.

Prostredníctvom direktív som zostavil jednoduchý program pre MQTTs spojenie pre obe platformy obsiahnuté do jedného zdrojového kódu. Na základe zvolenej platformy sa vykoná kompilácia iba pre tú danú platformu.

Tak ako v predchadzajúcom príklade pre MQTT sa v tomto prípade Publishuje topic esp32/pocitadlo a zároveň sa odoberá - Subscribe pre overenie funkčnosti a zápisu hodnôt. Odosielanie prebieha každých 10 sekúnd. Publish prebieha bez príkazaku retain. V prípade, že mikrokontróler prestane odosielať dáta do topicu po určitej dobe tento topic (ak nebude odoberaný Subscriberom) zahodí.

Knižnica PubSubClient, ktorá sa využíva umožňuje modifikovať pravidlá či už globálne alebo pre jednotlivé topicy. Vo funkcii client.publish(), ktorá využíva dva parametre - topic, obsah správy je možné použiť ďalšie parametre, ktoré umožňujú pridať dĺžku - lenght správy, prípadne je možné nastaviť prostredníctvom boolean parametra 0/1 retain príznak pre MQTT Broker.
Obrázok
V prípade viacerých topicov do ktorých mikrokontróler zapisuje je možné jednotlivo nastavovať retain príznak. Globálnejším riešením s pravidlami pre všetky odosielané topicy je možné implementovať retain príznak priamo do client.connect() funkcie. Je možné využiť údaje pre autentizáciu, nastaviť globálne pravidlá pre topicy a pod.

Dokumentáciu ku knižnici PubSubClient, ktorá sa v príkladoch využíva môžete nájsť na adrese: https://pubsubclient.knolleary.net/api.html

K programu pre MQTT a MQTTs spojenie bol vytvorený aj špeciálny zdrojový kód pre pripojenie platformy ESP32 k podnikovým WiFi sieťam pod WPA/WPA2 Enterprise - Ziggo, eduroam a ďalšie WiFi siete s prihlásením cez meno a heslo.

Všetky programové implementácie môžete nájsť na adrese: https://github.com/martinius96/MQTT-Broker-IoTIndustries

Späť na Hotové projekty