Si të instaloni dhe siguroni ndërmjetësin e mesazheve Mosquitto MQTT në Ubuntu 20.04
Mosquitto është një ndërmjetës mesazhesh me burim të hapur që përdor Protokollin e Transportit të Telemetrisë së Radhës së Mesazheve (MQTT). Protokolli është krijuar për të ofruar komunikim të lehtë me pajisjet e Internetit të Gjërave (IoT). Përdoret zakonisht për gjurmimin GPS të automjeteve, automatizimin e shtëpisë, sensorët mjedisorë dhe mbledhjen e të dhënave në shkallë të gjerë.
Protokolli MQTT funksionon në krye të modelit TCP/IP. Duke qenë i lehtë, gjurma e tij e vogël e kodit ju lejon të krijoni aplikacione për pajisje me burime minimale. Ai mbështetet në modelin e publikimit/subscribe. Në këtë model, klienti lidhet me serverin Mosquitto, i cili vepron si ndërmjetës për të dërguar informacion tek klientët e tjerë të abonuar në një kanal.
Në këtë tutorial, ju do të instaloni Mosquitto dhe do të konfiguroni ndërmjetësin për të përdorur SSL për të mbrojtur komunikimet.
Parakushtet
- Një server Ubuntu 20.04 me një përdorues jo-root me privilegje sudo.
- Një emër domaini (
myqtt.example.com
) i drejtuar nga serveri juaj.
Hapi 1 - Instaloni serverin dhe klientin Mosquitto
Ubuntu vjen me versionin më të vjetër 1.6 të Mosquitto. Për të instaluar versionin më të fundit, shtoni depon zyrtare të Mosquitto.
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Instaloni serverin Mosquitto dhe klientin.
$ sudo apt install mosquitto mosquitto-clients
Kontrolloni statusin e serverit.
$ sudo systemctl status mosquitto
? mosquitto.service - Mosquitto MQTT Broker
Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago
Docs: man:mosquitto.conf(5)
man:mosquitto(8)
Main PID: 119694 (mosquitto)
Tasks: 1 (limit: 2274)
Memory: 1.0M
CGroup: /system.slice/mosquitto.service
??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
Jan 25 09:18:39 <userid> systemd[1]: Starting Mosquitto MQTT Broker...
Jan 25 09:18:40 <userid> systemd[1]: Started Mosquitto MQTT Broker.
Hapi 2 - Konfiguro vërtetimin e fjalëkalimit MQTT
Mosquitto vjen me një mjet për të gjeneruar një skedar fjalëkalimi të quajtur mosquitto_passwd
. Mosquitto ruan të gjitha konfigurimet në drejtorinë /etc/mosquitto
.
Ekzekutoni komandën e mëposhtme për të gjeneruar një skedar fjalëkalimi të koduar në /etc/mosquitto/passwd
për emrin e përdoruesit username
. Futni një fjalëkalim sipas zgjedhjes suaj.
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username
Password:
Reenter password:
Më pas, krijoni një skedar default.conf
nën drejtorinë /etc/mosquitto/conf.d
dhe hapeni për modifikim.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Ngjitni rreshtat e mëposhtëm për të specifikuar vendndodhjen e skedarit të fjalëkalimit. Nëse e hiqni fushën e dëgjuesit, ajo do të lidhet gjithmonë në mënyrë anonime, pavarësisht nga konfigurimi.
listener 1883
password_file /etc/mosquitto/passwd
Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.
Rinisni serverin Mosquitto për të zbatuar ndryshimin.
$ sudo systemctl restart mosquitto
Hapi 3 - Testoni klientin Mushkonja
Në varësi të rastit të përdorimit, mund të përdorni klientin Mosquitto për të dërguar dhe marrë mesazhe për tema të ndryshme. Një klient është ose një pajtimtar ose botues.
Hapi tjetër është abonimi në një temë. Në protokollin MQTT, një temë i referohet një vargu të përdorur nga serveri/ndërmjetësi për të filtruar mesazhet për klientët e lidhur. Këtu janë disa tema shembull që mund të përdorni në një aplikacion për automatizimin e shtëpisë.
- shtëpi/dritat/dhoma e ndenjës
- shtëpi/dritat/kuzhina
- shtëpia/dritat/dhoma e gjumit
- shtëpia/dritat/dhoma e gjumit për fëmijë
Për t'u abonuar në një temë, ekzekutoni komandën mosquitto_sub -t
e ndjekur nga tema. Për shembull, për t'u abonuar në temën home/lights/kitchen
, ekzekutoni komandën e mëposhtme.
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"
Mos e mbyll dritaren ekzistuese. Hapni një dritare të re terminali për të publikuar një mesazh në temën home/lights/kitchen
duke përdorur komandën e mëposhtme.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"
Kthehuni te dritarja e parë e terminalit dhe do të merrni ngarkesën ON
.
ON
Më pas, dërgoni mesazhin OFF
për të njëjtën temë nga terminali i dytë.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"
Terminali i parë do të shfaqë mesazhin e sapopublikuar.
ON
OFF
Nëse përpiqeni të dërgoni një koment të paautentikuar, ai do të dështojë. Për shembull, provoni komandën e mëposhtme.
$ mosquitto_sub -t "home/lights/sitting_room"
Connection error: Connection Refused: not authorised.
Nuk rekomandohet, por duhet të shtoni rreshtin e mëposhtëm në skedarin /etc/mosquitto/conf.d/default.conf
nëse dëshironi të ekzekutoni komandat pa vërtetim.
allow_anonymous true
Hapi 4 - Instaloni SSL
Për të instaluar një certifikatë SSL duke përdorur Lets Encrypt, duhet të shkarkojmë mjetin Certbot. Ne do të përdorim instaluesin e paketës Snapd për këtë.
Instaloni instaluesin Snap.
$ sudo apt install snapd
Sigurohuni që versioni juaj i Snapd të jetë i përditësuar.
$ sudo snap install core
$ sudo snap refresh core
Instaloni Certbot.
$ sudo snap install --classic certbot
Përdorni komandën e mëposhtme për të siguruar që komanda Certbot të ekzekutohet duke krijuar një lidhje simbolike në drejtorinë /usr/bin
.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Gjeneroni një certifikatë SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m -d mqtt.example.com
Komanda e mësipërme do të shkarkojë një certifikatë në drejtorinë /etc/letsencrypt/live/mqtt.example.com
në serverin tuaj.
Krijo një certifikatë grupi Diffie-Hellman.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Krijoni një direktorium rrënjësor të uebit sfidues për rinovimin automatik të Lets Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Krijo një Cron Job për të rinovuar SSL. Do të funksionojë çdo ditë për të kontrolluar certifikatën dhe për të rinovuar nëse është e nevojshme. Për këtë, së pari, krijoni skedarin /etc/cron.daily/certbot-renew
dhe hapeni atë për redaktim.
$ sudo nano /etc/cron.daily/certbot-renew
Ngjit kodin e mëposhtëm.
#!/bin/sh
certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.
Ndryshoni lejet në skedarin e detyrës për ta bërë atë të ekzekutueshëm.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Hapi 5 - Konfiguro MQTT SSL
Tani që kemi gati certifikatat SSL, duhet t'i sigurojmë Mosquitto qasjen në to. Për këtë, ne duhet t'i kopjojmë certifikatat në një vend nga ku Mosquitto mund t'i qaset ato.
$ 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
Ndrysho pronësinë e drejtorisë /etc/mosquitto/certs
te përdoruesi mushkonja
i krijuar gjatë instalimit.
$ sudo chown mosquitto: /etc/mosquitto/certs
Hapi tjetër për të aktivizuar kriptimin SSL për Mosquitto është të specifikoni vendndodhjen e certifikatave SSL. Hapni skedarin e konfigurimit për redaktim.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Ngjitni kodin e mëposhtëm në fund të skedarit.
. . .
listener 8883
certfile /etc/mosquitto/certs/server.pem
cafile /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem
Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet. Sigurohuni që të lini një vijë të re pasuese në fund të skedarit.
Pjesa dëgjues 8883
konfiguron dëgjuesin e koduar. Është porti standard për MQTT + SSL, i referuar si MQTTS. Katër rreshtat e ardhshëm specifikojnë vendndodhjen e skedarëve SSL.
Rinisni Mosquitto për të përditësuar cilësimet.
$ sudo systemctl restart mosquitto
Do t'ju duhet të përditësoni murin e zjarrit për të lejuar lidhjet me portin 8883.
$ sudo ufw allow 8883
Më pas, duhet të testojmë funksionalitetin duke përdorur komandën mosquitto_pub
.
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
Siç mund ta shihni, ne kemi përfshirë disa parametra shtesë, duke përfshirë numrin e portit dhe rrugën drejt certifikatave SSL. Sa herë që ju duhet të përdorni SSL, gjithmonë do të duhet të specifikoni emrin e plotë të hostit, d.m.th., mqtt.example.com
në vend të localhost
përndryshe, ai do të jepte një gabim.
Do t'ju duhet gjithashtu të shtoni direktivën --capath
çdo herë. Ai i thotë klientit Mosquitto të kërkojë certifikata rrënjësore të instaluara nga sistemi operativ.
Hapi 6 - Konfiguro Rinovimin SSL
Certbot do të rinovojë automatikisht certifikatën tuaj përpara se të skadojë. Por duhet t'i thuhet që të kopjojë certifikatat e rinovuara në drejtorinë /etc/mosquitto/certs
dhe të rifillojë shërbimin Mosquitto.
Ne do ta bëjmë këtë duke krijuar një skript shell. Krijo një skedar mosquitto-copy.sh
në drejtorinë /etc/letsencrypt/renewal-hooks/deploy
.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Vendos kodin e mëposhtëm në të. Zëvendësoni vlerën e ndryshores MY_DOMAIN
me domenin tuaj. Ndryshorja $ {RENEWED_LINEAGE}
tregon në drejtorinë /etc/letsencrypt/live/mqtt.example.com
gjatë rinovimit.
# Set which domain this script will be run for
MY_DOMAIN=mqtt.example.com
# Set the directory that the certificates will be copied to.
CERTIFICATE_DIR=/etc/mosquitto/certs
if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then
# Copy new certificate to Mosquitto directory
cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem
cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key
# Set ownership to Mosquitto
chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key
# Ensure permissions are restrictive
chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key
# Tell Mosquitto to reload certificates and configuration
pkill -HUP -x mosquitto
fi
Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.
Bëni skedarin të ekzekutueshëm.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Ky skript do të ekzekutohet automatikisht në çdo rinovim të suksesshëm të certifikatës.
Nëse po ekzekutoni Mosquitto dhe një server në internet si Nginx, duhet të udhëzoni Certbot të ndalojë serverin përpara rinovimit dhe ta rifillojë atë pasi të përfundojë. Për ta bërë këtë, hapni skedarin etc/letsencrypt/renewal/mqtt.example.com.conf
.
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Shtoni rreshtat e mëposhtëm në fund të skedarit. Ndryshoni komandat në përputhje me uebserverin që po përdorni.
pre_hook = systemctl stop nginx
post_hook = systemctl start nginx
Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.
Drejtoni një ekzekutim të thatë Certbot për të verifikuar.
$ sudo certbot renew --dry-run
Nëse nuk shihni asnjë gabim, do të thotë se gjithçka është vendosur.
Hapi 7 - Konfiguro Websockets
Ju mund të konfiguroni Mosquitto që të përdorë protokollin MQTT nga brenda shfletuesve duke përdorur Javascript duke përdorur funksionalitetin Websockets. Për ta aktivizuar, hapni skedarin e konfigurimit.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Ngjitni rreshtat e mëposhtëm në fund të skedarit.
. . .
listener 8083
protocol websockets
certfile /etc/mosquitto/certs/server.pem
cafile /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem
Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.
Nëse vini re, është i njëjti bllok si ai që kemi përdorur për aktivizimin e SSL, përveç numrit të portit dhe fushave të protokollit. 8083 është porti më i zakonshëm i përdorur nga MQTT për të folur duke përdorur WebSockets.
Rinisni shërbimin Mosquitto.
$ sudo systemctl restart mosquitto
Hap portin 8083.
$ sudo ufw allow 8083
Ne duhet të përdorim një klient MQTT të bazuar në shfletues për të testuar funksionalitetin e WebSockets. Ka shumë klientë të disponueshëm, por ne do të përdorim klientin HiveMQ Websocket për qëllimin tonë. Nisni klientin në shfletuesin tuaj dhe do të shihni sa vijon.
Siç tregohet në pamjen e mësipërme, plotësoni fushat siç tregohet.
- Pritësi duhet të jetë domeni i serverit tuaj Mosquitto, mqtt.example.com.
- Port duhet të jetë 8083.
- Fusha e ID-së së klientit mund të lihet ashtu siç është.
- Emri i përdoruesit duhet të jetë emri juaj i përdoruesit Mosquitto.
- Fjalëkalimi duhet të jetë fjalëkalimi që keni krijuar më sipër.
- Kontrollo kutinë SSL.
Shtypni butonin Lidhu dhe klienti HiveMQ do të lidhet me serverin tuaj Mosquitto.
Pasi të lidheni, shkruani home/lights/kitchen
si temë, futni çdo mesazh dhe shtypni Publiko.
Mesazhi do të shfaqet në dritaren tuaj të terminalit mosquitto_sub
duke konfirmuar lidhjen e suksesshme.
Kjo tregon se zbatimi i Websockets është i suksesshëm.
konkluzioni
Kjo përfundon konfigurimin tonë të një serveri MQTT të sigurt, të mbrojtur me fjalëkalim dhe të koduar me SSL në një makinë të bazuar në Ubuntu 20.04. Nëse keni ndonjë pyetje, postojini ato në komentet më poshtë.