Mosquitto je zprostředkovatel zpráv s otevřeným zdrojovým kódem, který využívá přenos telemetrie ve frontě zpráv (MQTT ) Protokol. Protokol je navržen tak, aby poskytoval nenáročnou komunikaci s internetem věcí (IoT ) zařízení. Běžně se používá pro GPS sledování vozidel, domácí automatizaci, environmentální senzory a rozsáhlý sběr dat.
Protokol MQTT běží nad modelem TCP/IP. Vzhledem k tomu, že je lehký, jeho malá kódová stopa vám umožňuje vytvářet aplikace pro zařízení s minimálními prostředky. Spoléhá na model publikování/odběru. V tomto modelu se klient připojuje k serveru Mosquitto, který funguje jako zprostředkovatel pro zasílání informací dalším klientům přihlášeným k odběru kanálu.
V tomto tutoriálu nainstalujete Mosquitto a nastavíte brokera, aby používal SSL k ochraně komunikace.
Předpoklady
- Server Ubuntu 20.04 s uživatelem bez oprávnění root s právy sudo.
- Název domény (
myqtt.example.com
) ukázal na váš server.
Krok 1 – Instalace Mosquitto serveru a klienta
Ubuntu se dodává se starší verzí Mosquitto 1.6. Chcete-li nainstalovat nejnovější verzi, přidejte oficiální úložiště Mosquitto.
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Nainstalujte server Mosquitto a klienta.
$ sudo apt install mosquitto mosquitto-clients
Zkontrolujte stav serveru.
$ sudo systemctl status komára? mosquitto.service - Mosquitto MQTT Broker Načteno:načteno (/lib/systemd/system/mosquitto.service; povoleno; přednastaveno dodavatelem:povoleno) Aktivní:aktivní (běží) od Út 2022-01-25 09:18:40 UTC; Před 25s Dokumenty:muž:mosquitto.conf(5) muž:mosquitto(8) Hlavní PID:119694 (komár) Úkoly:1 (limit:2274) Paměť:1.0M CGroup:/system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.confJan 25 09:18:39systemd[1]:Spouštění Mosquitto MQTT Broker...Jan 25 09:18:40 systemd[1 ]:Spuštěn Mosquitto MQTT Broker.
Krok 2 – Konfigurace ověřování hesla MQTT
Mosquitto přichází s nástrojem pro generování souboru s hesly s názvem mosquitto_passwd
. Mosquitto ukládá všechny konfigurace do /etc/mosquitto
adresář.
Spusťte následující příkaz pro vygenerování zašifrovaného souboru s hesly na /etc/mosquitto/passwd
pro uživatelské jméno username
. Zadejte heslo dle vlastního výběru.
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd uživatelské jménoHeslo:Znovu zadejte heslo:
Dále vytvořte default.conf
soubor pod /etc/mosquitto/conf.d
adresář a otevřete jej pro úpravy.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Vložte následující řádky a zadejte umístění souboru s hesly. Pokud pole posluchače vynecháte, připojí se vždy anonymně, bez ohledu na konfiguraci.
listener 1883password_file /etc/mosquitto/passwd
Uložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni.
Restartujte server Mosquitto, abyste provedli změnu.
$ sudo systemctl restart mosquitto
Krok 3 – Test Mosquitto klienta
V závislosti na případu použití můžete klienta Mosquitto použít k odesílání a přijímání zpráv na různá témata. Klient je buď předplatitel, nebo vydavatel.
Dalším krokem je přihlášení k odběru tématu. V protokolu MQTT téma odkazuje na řetězec používaný serverem/brokerem k filtrování zpráv pro připojené klienty. Zde je několik ukázkových témat, která můžete použít v aplikaci pro automatizaci domácnosti.
- domov/světla/obývací pokoj
- domov/světla/kuchyň
- home/lights/master_bedroom
- domov/světla/dětská_ložnice
Chcete-li se přihlásit k odběru tématu, spusťte mosquitto_sub -t
příkaz následovaný tématem. Chcete-li se například přihlásit k odběru home/lights/kitchen
topic, spusťte následující příkaz.
$ mosquitto_sub -u uživatelské jméno -P VAŠE_HESLO -t "domov/světla/kuchyň"
Nezavírejte stávající okno. Otevřete nové okno terminálu a publikujte zprávu do home/lights/kitchen
topic pomocí následujícího příkazu.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kuchyň"
Vraťte se do prvního okna terminálu a obdržíte ON
užitečné zatížení.
ZAPNUTO
Dále odešlete OFF
zpráva na stejné téma z druhého terminálu.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kuchyň"
První terminál zobrazí nově publikovanou zprávu.
ZAPNUTO
Pokud se pokusíte odeslat neověřený komentář, selže. Zkuste například následující příkaz.
$ mosquitto_sub -t "home/lights/sitting_room"Chyba připojení:Připojení odmítnuto:není autorizováno.
Nedoporučuje se to, ale musíte přidat následující řádek do /etc/mosquitto/conf.d/default.conf
soubor, pokud chcete spouštět příkazy bez ověření.
allow_anonymous true
Krok 4 – Instalace protokolu SSL
Pro instalaci SSL certifikátu pomocí Let's Encrypt si musíme stáhnout nástroj Certbot. K tomu použijeme instalační program balíčku Snapd.
Nainstalujte instalační program Snap.
$ sudo apt install snapd
Ujistěte se, že vaše verze Snapd je aktuální.
$ instalační jádro sudo snap $ jádro obnovení sudo snap
Nainstalujte Certbot.
$ instalace sudo snap --classic certbot
Pomocí následujícího příkazu zajistěte spuštění příkazu Certbot vytvořením symbolického odkazu na /usr/bin
adresář.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Vygenerujte certifikát SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [e-mail chráněný] -d mqtt.example.com
Výše uvedený příkaz stáhne certifikát do /etc/letsencrypt/live/mqtt.example.com
adresář na vašem serveru.
Vytvořte skupinu Diffie-Hellman certifikát.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Vytvořte webový kořenový adresář výzvy pro automatické obnovení Let's Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Vytvořte úlohu Cron pro obnovení SSL. Poběží každý den, aby se zkontroloval certifikát a v případě potřeby se obnoví. Nejprve vytvořte soubor /etc/cron.daily/certbot-renew
a otevřete jej pro úpravy.
$ sudo nano /etc/cron.daily/certbot-renew
Vložte následující kód.
#!/bin/shcertbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Uložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni.
Změňte oprávnění k souboru úlohy, aby byl spustitelný.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Krok 5 – Konfigurace protokolu MQTT SSL
Nyní, když máme připravené certifikáty SSL, musíme k nim poskytnout přístup Mosquitto. K tomu potřebujeme zkopírovat certifikáty na místo, odkud k nim Mosquitto může přistupovat.
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey. pem /etc/mosquitto/certs/server.key
Změňte vlastnictví /etc/mosquitto/certs
do adresáře mosquitto
uživatel vytvořený během instalace.
$ sudo chown mosquitto:/etc/mosquitto/certs
Dalším krokem k povolení šifrování SSL pro Mosquitto je zadat umístění certifikátů SSL. Otevřete konfigurační soubor pro úpravy.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Vložte následující kód na konec souboru.
. . .listener 8883certfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam>.Uložte soubor stisknutím Ctrl + X a zadáním Y po výzvě. Nezapomeňte na konci souboru zanechat konec nového řádku.
listener 8883
část nastaví šifrovaný posluchač. Je to standardní port pro MQTT + SSL, označovaný jako MQTTS. Další čtyři řádky určují umístění souborů SSL.Restartujte Mosquitto pro aktualizaci nastavení.
$ sudo systemctl restart mosquittoBudete muset aktualizovat bránu firewall, abyste umožnili připojení k portu 8883.
$ sudo ufw allow 8883Dále musíme otestovat funkčnost pomocí
mosquitto_pub
příkaz.$ mosquitto_pub -h mqtt.example.com -t "domov/světla/kuchyň" -m "ahoj" -p 8883 --capath /etc/ssl/certs/ -u uživatelské jméno -P VAŠE_HESLOJak vidíte, zahrnuli jsme některé další parametry, včetně čísla portu a cesty k certifikátům SSL. Kdykoli budete potřebovat použít SSL, budete muset vždy zadat celý název hostitele, tj.
mqtt.example.com
místolocalhost
jinak by došlo k chybě.Budete také muset přidat
--capath
směrnice pokaždé. Říká klientovi Mosquitto, aby hledal kořenové certifikáty nainstalované operačním systémem.Krok 6 – Konfigurace obnovení SSL
Certbot automaticky obnoví váš certifikát před vypršením jeho platnosti. Ale je třeba říct, že má zkopírovat obnovené certifikáty do
/etc/mosquitto/certs
adresář a restartujte službu Mosquitto.Uděláme to vytvořením skriptu shellu. Vytvořte soubor
mosquitto-copy.sh
v/etc/letsencrypt/renewal-hooks/deploy
adresář.$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.shVložte do něj následující kód. Nahraďte hodnotu
MY_DOMAIN
proměnná s vaší doménou.${RENEWED_LINEAGE}
proměnná ukazuje na/etc/letsencrypt/live/mqtt.example.com
adresář během obnovy.# Nastavení domény, pro kterou bude tento skript spouštěn proMY_DOMAIN=mqtt.example.com# Nastavte adresář, do kterého budou certifikáty zkopírovány.CERTIFICATE_DIR=/etc/mosquitto/certsif [ "${RENEWED_DOMAINS}" ="${ MOJE_DOMÉNA“ ]; potom # Zkopírujte nový certifikát do adresáře Mosquitto cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Nastavit vlastnictví na Mosquittochown:${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Ujistěte se, že oprávnění jsou omezující chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Řekněte Mosquitto, aby znovu načetl certifikáty a konfiguraci pkill -x komárUložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni.
Nastavte soubor jako spustitelný.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.shTento skript bude automaticky spuštěn při každém úspěšném obnovení certifikátu.
Pokud používáte Mosquitto a webový server, jako je Nginx, musíte dát Certbotovi pokyn, aby server před obnovením zastavil a po dokončení jej znovu spustil. Chcete-li to provést, otevřete soubor
etc/letsencrypt/renewal/mqtt.example.com.conf
.$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.confPřidejte následující řádky na konec souboru. Změňte příkazy podle webového serveru, který používáte.
pre_hook =systemctl stop nginxpost_hook =systemctl start nginxUložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni.
Pro ověření spusťte zkušební cyklus Certbot.
$ sudo certbot renew --dry-runPokud nevidíte žádné chyby, znamená to, že je vše nastaveno.
Krok 7 – Konfigurace Websockets
Mosquitto můžete nakonfigurovat tak, aby používal protokol MQTT z prohlížečů pomocí Javascriptu pomocí funkce Websockets. Chcete-li to povolit, otevřete konfigurační soubor.
$ sudo nano /etc/mosquitto/conf.d/default.confVložte následující řádky na konec souboru.
. . .listener 8083protocol websocketscertfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/sdsl/certs>sdhm.Uložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni.
Pokud si všimnete, je to stejný blok jako ten, který jsme použili pro povolení SSL, s výjimkou pole čísla portu a protokolu. 8083 je nejběžnější port používaný MQTT pro komunikaci pomocí WebSockets.
Restartujte službu Mosquitto.
$ sudo systemctl restart mosquittoOtevřete port 8083.
$ sudo ufw allow 8083K testování funkčnosti WebSockets musíme použít klienta MQTT založeného na prohlížeči. K dispozici je mnoho klientů, ale pro náš účel použijeme klienta HiveMQ Websocket. Spusťte klienta ve svém prohlížeči a uvidíte následující.
Jak je znázorněno na obrázku výše, vyplňte pole podle obrázku.
- Hostitelem by měla být doména vašeho serveru Mosquitto, mqtt.example.com.
- Port by měl být 8083.
- Pole ClientID lze ponechat tak, jak je.
- Uživatelské jméno by mělo být vaše uživatelské jméno Mosquitto.
- Heslo by mělo být heslo, které jste vytvořili výše.
- Zkontrolujte SSL krabice.
Stiskněte tlačítko Připojit a klient HiveMQ bude připojen k vašemu serveru Mosquitto.
Po připojení zadejte home/lights/kitchen
jako téma zadejte libovolnou zprávu a stiskněte Publikovat .
Zpráva se zobrazí ve vašem mosquitto_sub
okno terminálu potvrzující úspěšné připojení.
To ukazuje, že implementace Websockets je úspěšná.
Závěr
Tím je naše nastavení zabezpečeného, heslem chráněného a SSL šifrovaného serveru MQTT na počítači založeném na Ubuntu 20.04 uzavřeno. Pokud máte nějaké dotazy, napište je do komentářů níže.