Mosquitto è un broker di messaggi open source che utilizza il trasporto di telemetria di Accodamento messaggi (MQTT ) Protocollo. Il protocollo è progettato per fornire comunicazioni leggere all'Internet delle cose (IoT ) dispositivi. Viene comunemente utilizzato per il tracciamento GPS di veicoli, la domotica, i sensori ambientali e la raccolta di dati su larga scala.
Il protocollo MQTT viene eseguito sul modello TCP/IP. Essendo leggero, il suo ridotto ingombro di codice consente di creare applicazioni per dispositivi con risorse minime. Si basa sul modello di pubblicazione/sottoscrizione. In questo modello, il client si connette al server Mosquitto, che funge da broker per inviare informazioni ad altri client iscritti a un canale.
In questo tutorial, installerai Mosquitto e configurerai il broker per utilizzare SSL per proteggere le comunicazioni.
Prerequisiti
- Un server Ubuntu 20.04 con un utente non root con privilegi sudo.
- Un nome di dominio (
myqtt.example.com
) puntato al tuo server.
Passaggio 1:installazione di server e client Mosquitto
Ubuntu viene fornito con la versione precedente 1.6 di Mosquitto. Per installare l'ultima versione, aggiungi il repository ufficiale di Mosquitto.
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Installa il server Mosquitto e il client.
$ sudo apt install mosquitto mosquitto-clients
Controlla lo stato del server.
$ sudo systemctl status mosquitto? mosquitto.service - Broker Mosquitto MQTT Caricato:caricato (/lib/systemd/system/mosquitto.service; abilitato; preimpostazione del fornitore:abilitato) Attivo:attivo (in esecuzione) da mar 25-01-2022 09:18:40 UTC; 25s fa Documenti:man:mosquitto.conf(5) man:mosquitto(8) PID principale:119694 (mosquitto) Compiti:1 (limite:2274) Memoria:1.0M CGroup:/system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.confJan 25 09:18:39systemd[1]:Avvio di Mosquitto MQTT Broker...Jan 25 09:18:40 systemd[1 ]:ha avviato Mosquitto MQTT Broker.
Passaggio 2:configurazione dell'autenticazione password MQTT
Mosquitto viene fornito con un'utilità per generare un file di password chiamato mosquitto_passwd
. Mosquitto memorizza tutte le configurazioni nel /etc/mosquitto
directory.
Esegui il comando seguente per generare un file di password crittografato in /etc/mosquitto/passwd
per il nome utente username
. Inserisci una password a tua scelta.
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd usernamePassword:Reinserire la password:
Quindi, crea un default.conf
file sotto il /etc/mosquitto/conf.d
directory e aprirla per la modifica.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Incolla le seguenti righe per specificare la posizione del file della password. Se ometti il campo listener, si connetterà sempre in modo anonimo, indipendentemente dalla configurazione.
ascoltatore 1883password_file /etc/mosquitto/passwd
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Riavvia il server Mosquitto per implementare la modifica.
$ sudo systemctl riavvia mosquitto
Fase 3:prova il client Mosquitto
A seconda del caso d'uso, puoi utilizzare il client Mosquitto per inviare e ricevere messaggi su argomenti diversi. Un cliente può essere un abbonato o un editore.
Il passaggio successivo è iscriversi a un argomento. Nel protocollo MQTT, un argomento fa riferimento a una stringa utilizzata dal server/broker per filtrare i messaggi per i client connessi. Di seguito sono riportati alcuni argomenti di esempio che puoi utilizzare in un'applicazione domotica.
- casa/luci/soggiorno
- casa/luci/cucina
- casa/luci/camera da letto principale
- casa/luci/camera_bambini
Per iscriverti a un argomento, esegui mosquitto_sub -t
comando seguito dall'argomento. Ad esempio, per iscriversi a home/lights/kitchen
topic, esegui il comando seguente.
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "casa/luci/cucina"
Non chiudere la finestra esistente. Apri una nuova finestra del terminale per pubblicare un messaggio nella home/lights/kitchen
argomento utilizzando il comando seguente.
$ mosquitto_pub -u nome utente -P YOUR_PASSWORD -m "ON" -t "casa/luci/cucina"
Torna alla prima finestra del terminale e riceverai ON
carico utile.
ON
Quindi, invia il OFF
messaggio sullo stesso argomento dal secondo terminale.
$ mosquitto_pub -u nome utente -P YOUR_PASSWORD -m "OFF" -t "casa/luci/cucina"
Il primo terminale mostrerà il messaggio appena pubblicato.
ONOFF
Se provi a inviare un commento non autenticato, fallirà. Ad esempio, prova il seguente comando.
$ mosquitto_sub -t "home/lights/sitting_room"Errore di connessione:Connessione rifiutata:non autorizzato.
Non è raccomandato, ma devi aggiungere la seguente riga a /etc/mosquitto/conf.d/default.conf
file se vuoi eseguire i comandi senza autenticazione.
allow_anonymous vero
Fase 4 - Installa SSL
Per installare un certificato SSL utilizzando Let's Encrypt, è necessario scaricare lo strumento Certbot. Utilizzeremo il programma di installazione del pacchetto Snapd per questo.
Installa il programma di installazione Snap.
$ sudo apt install snapd
Assicurati che la tua versione di Snapd sia aggiornata.
$ sudo snap install core $ sudo snap refresh core
Installa Certbot.
$ sudo snap install --classic certbot
Utilizzare il comando seguente per assicurarsi che il comando Certbot venga eseguito creando un collegamento simbolico a /usr/bin
directory.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Genera un certificato SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protetta] -d mqtt.example.com
Il comando precedente scaricherà un certificato in /etc/letsencrypt/live/mqtt.example.com
directory sul tuo server.
Genera un gruppo Diffie-Hellman certificato.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Crea una directory radice web di sfida per il rinnovo automatico di Let's Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Crea un Cron Job per rinnovare l'SSL. Verrà eseguito ogni giorno per controllare il certificato e rinnovarlo se necessario. Per questo, prima crea il file /etc/cron.daily/certbot-renew
e aprilo per la modifica.
$ sudo nano /etc/cron.daily/certbot-renew
Incolla il seguente codice.
#!/bin/shcertbot rinnovo --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Modifica le autorizzazioni sul file dell'attività per renderlo eseguibile.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Passaggio 5 - Configura SSL MQTT
Ora che abbiamo i certificati SSL pronti, dobbiamo fornire a Mosquitto l'accesso ad essi. Per questo, dobbiamo copiare i certificati in una posizione da cui Mosquitto possa accedervi.
$ 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
Modifica la proprietà del /etc/mosquitto/certs
directory alla mosquitto
utente creato durante l'installazione.
$ sudo chown mosquitto:/etc/mosquitto/certs
Il passaggio successivo per abilitare la crittografia SSL per Mosquitto è specificare la posizione dei certificati SSL. Apri il file di configurazione per la modifica.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Incolla il codice seguente alla fine del file.
Salva il file premendo Ctrl + X e inserendo Y quando richiesto. Assicurati di lasciare una nuova riga finale alla fine del file.
Il listener 8883
porzione imposta il listener crittografato. È la porta standard per MQTT + SSL, denominata MQTTS. Le quattro righe successive specificano la posizione dei file SSL.
Riavvia Mosquitto per aggiornare le impostazioni.
$ sudo systemctl riavvia mosquitto
Sarà necessario aggiornare il firewall per consentire le connessioni alla porta 8883.
$ sudo ufw consenti 8883
Successivamente, dobbiamo testare la funzionalità utilizzando mosquitto_pub
comando.
$ mosquitto_pub -h mqtt.example.com -t "casa/luci/cucina" -m "ciao" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
Come puoi vedere, abbiamo incluso alcuni parametri aggiuntivi, tra cui il numero di porta e il percorso dei certificati SSL. Ogni volta che devi utilizzare SSL, dovrai sempre specificare il nome host completo, ovvero mqtt.example.com
invece di localhost
altrimenti darebbe un errore.
Dovrai anche aggiungere il --capath
direttiva ogni volta. Dice al client Mosquitto di cercare i certificati radice installati dal sistema operativo.
Passaggio 6:configurazione del rinnovo SSL
Certbot rinnoverà automaticamente il tuo certificato prima della scadenza. Ma è necessario dirgli di copiare i certificati rinnovati in /etc/mosquitto/certs
directory e riavvia il servizio Mosquitto.
Lo faremo creando uno script di shell. Crea un file mosquitto-copy.sh
nel /etc/letsencrypt/renewal-hooks/deploy
directory.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Incolla il codice seguente al suo interno. Sostituisci il valore di MY_DOMAIN
variabile con il tuo dominio. Il ${RENEWED_LINEAGE}
la variabile punta a /etc/letsencrypt/live/mqtt.example.com
directory durante il rinnovo.
# Imposta su quale dominio verrà eseguito questo script forMY_DOMAIN=mqtt.example.com# Imposta la directory in cui verranno copiati i certificati.CERTIFICATE_DIR=/etc/mosquitto/certsif [ "${RENEWED_DOMAINS}" ="${ MIO_DOMINIO}" ]; quindi # Copia il nuovo certificato nella directory Mosquitto cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Imposta la proprietà su Mosquitto chown mosquitto:${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Assicurati che i permessi siano restrittivi chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Indica a Mosquitto di ricaricare i certificati e la configurazione pkill -HUP -x zanzare
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Rendi il file eseguibile.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Questo script verrà eseguito automaticamente ad ogni rinnovo riuscito del certificato.
Se stai utilizzando Mosquitto e un server web come Nginx, devi indicare a Certbot di arrestare il server prima del rinnovo e riavviarlo una volta terminato. Per farlo, apri il file etc/letsencrypt/renewal/mqtt.example.com.conf
.
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Aggiungi le seguenti righe alla fine del file. Modifica i comandi in base al server web che stai utilizzando.
pre_hook =systemctl ferma nginxpost_hook =systemctl avvia nginx
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Esegui una prova a secco di Certbot per verificare.
$ sudo certbot rinnovo --dry-run
Se non vedi errori, significa che tutto è impostato.
Passaggio 7:configurazione dei Websocket
È possibile configurare Mosquitto per utilizzare il protocollo MQTT dall'interno dei browser utilizzando Javascript utilizzando la funzionalità Websockets. Per abilitarlo, apri il file di configurazione.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Incolla le seguenti righe alla fine del file.
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Se noti, è lo stesso blocco che abbiamo usato per abilitare SSL ad eccezione del numero di porta e dei campi del protocollo. 8083 è la porta più comune utilizzata da MQTT per comunicare tramite WebSocket.
Riavvia il servizio Mosquitto.
$ sudo systemctl riavvia mosquitto
Apri la porta 8083.
$ sudo ufw allow 8083
È necessario utilizzare un client MQTT basato su browser per testare la funzionalità WebSocket. Ci sono molti client disponibili, ma utilizzeremo il client Websocket HiveMQ per i nostri scopi. Avvia il client nel tuo browser e vedrai quanto segue.
Come mostrato nella schermata sopra, riempi i campi come mostrato.
- L'host dovrebbe essere il dominio del tuo server Mosquitto, mqtt.example.com.
- La porta dovrebbe essere 8083.
- Il campo ClientID può essere lasciato così com'è.
- Il nome utente dovrebbe essere il tuo nome utente Mosquitto.
- La password dovrebbe essere la password che hai creato sopra.
- Controlla SSL scatola.
Premi il pulsante Connetti e il client HiveMQ sarà connesso al tuo server Mosquitto.
Una volta connesso, inserisci home/lights/kitchen
come argomento, inserisci qualsiasi messaggio e premi Pubblica .
Il messaggio apparirà nel tuo mosquitto_sub
finestra del terminale che conferma l'avvenuta connessione.
Ciò dimostra che l'implementazione di Websocket è riuscita.
Conclusione
Questo conclude la nostra configurazione di un server MQTT sicuro, protetto da password e crittografato SSL su una macchina basata su Ubuntu 20.04. Se hai domande, pubblicale nei commenti qui sotto.