Mosquitto est un courtier de messages open source qui utilise le transport de télémétrie Message Queuing (MQTT ) Protocole. Le protocole est conçu pour fournir une communication légère à l'Internet des objets (IoT ) dispositifs. Il est couramment utilisé pour le suivi GPS des véhicules, la domotique, les capteurs environnementaux et la collecte de données à grande échelle.
Le protocole MQTT s'exécute au-dessus du modèle TCP/IP. Étant léger, sa petite empreinte de code vous permet de créer des applications pour des appareils avec un minimum de ressources. Il s'appuie sur le modèle de publication/abonnement. Dans ce modèle, le client se connecte au serveur Mosquitto, qui agit comme un courtier pour envoyer des informations à d'autres clients abonnés à un canal.
Dans ce didacticiel, vous allez installer Mosquitto et configurer le courtier pour qu'il utilise SSL pour protéger les communications.
Prérequis
- Un serveur Ubuntu 20.04 avec un utilisateur non root avec des privilèges sudo.
- Un nom de domaine (
myqtt.example.com
) pointé vers votre serveur.
Étape 1 - Installer le serveur et le client Mosquitto
Ubuntu est livré avec l'ancienne version 1.6 de Mosquitto. Pour installer la dernière version, ajoutez le dépôt officiel de Mosquitto.
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Installez le serveur Mosquitto et le client.
$ sudo apt install mosquitto mosquitto-clients
Vérifiez l'état du serveur.
$ 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.
Étape 2 - Configurer l'authentification par mot de passe MQTT
Mosquitto est livré avec un utilitaire pour générer un fichier de mot de passe appelé mosquitto_passwd
. Mosquitto stocke toutes les configurations dans le /etc/mosquitto
répertoire.
Exécutez la commande suivante pour générer un fichier de mot de passe crypté dans /etc/mosquitto/passwd
pour le nom d'utilisateur username
. Entrez un mot de passe de votre choix.
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username Password: Reenter password:
Ensuite, créez un default.conf
fichier sous /etc/mosquitto/conf.d
répertoire et ouvrez-le pour le modifier.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Collez les lignes suivantes pour spécifier l'emplacement du fichier de mot de passe. Si vous omettez le champ d'écoute, il se connectera toujours de manière anonyme, quelle que soit la configuration.
listener 1883 password_file /etc/mosquitto/passwd
Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.
Redémarrez le serveur Mosquitto pour mettre en œuvre le changement.
$ sudo systemctl restart mosquitto
Étape 3 - Tester le client Mosquitto
Selon le cas d'utilisation, vous pouvez utiliser le client Mosquitto pour envoyer et recevoir des messages sur différents sujets. Un client est soit un abonné, soit un éditeur.
L'étape suivante consiste à s'abonner à un sujet. Dans le protocole MQTT, un sujet fait référence à une chaîne utilisée par le serveur/broker pour filtrer les messages pour les clients connectés. Voici quelques exemples de rubriques que vous pouvez utiliser dans une application domotique.
- home/lights/sitting_room
- maison/lumières/cuisine
- accueil/lumières/chambre_principale
- accueil/lumières/chambre_enfants
Pour vous abonner à un sujet, exécutez le mosquitto_sub -t
commande suivie du sujet. Par exemple, pour s'abonner à home/lights/kitchen
sujet, exécutez la commande suivante.
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"
Ne fermez pas la fenêtre existante. Ouvrir une nouvelle fenêtre de terminal pour publier un message sur home/lights/kitchen
sujet à l'aide de la commande suivante.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"
Retournez à la première fenêtre du terminal et vous recevrez ON
charge utile.
ON
Ensuite, envoyez le OFF
message sur le même sujet depuis le second terminal.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"
Le premier terminal affichera le message nouvellement publié.
ON OFF
Si vous essayez d'envoyer un commentaire non authentifié, cela échouera. Par exemple, essayez la commande suivante.
$ mosquitto_sub -t "home/lights/sitting_room" Connection error: Connection Refused: not authorised.
Ce n'est pas recommandé, mais vous devez ajouter la ligne suivante au /etc/mosquitto/conf.d/default.conf
fichier si vous souhaitez exécuter les commandes sans authentification.
allow_anonymous true
Étape 4 - Installer SSL
Pour installer un certificat SSL avec Let's Encrypt, nous devons télécharger l'outil Certbot. Nous utiliserons le programme d'installation du package Snapd pour cela.
Installez le programme d'installation de Snap.
$ sudo apt install snapd
Assurez-vous que votre version de Snapd est à jour.
$ sudo snap install core $ sudo snap refresh core
Installez Certbot.
$ sudo snap install --classic certbot
Utilisez la commande suivante pour vous assurer que la commande Certbot s'exécute en créant un lien symbolique vers /usr/bin
répertoire.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Générez un certificat SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com
La commande ci-dessus téléchargera un certificat sur /etc/letsencrypt/live/mqtt.example.com
répertoire sur votre serveur.
Générer un groupe Diffie-Hellman certificat.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Créez un répertoire racine Web de défi pour le renouvellement automatique de Let's Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Créez une tâche Cron pour renouveler le SSL. Il s'exécutera tous les jours pour vérifier le certificat et le renouveler si nécessaire. Pour cela, créez d'abord le fichier /etc/cron.daily/certbot-renew
et ouvrez-le pour le modifier.
$ sudo nano /etc/cron.daily/certbot-renew
Collez le code suivant.
#!/bin/sh certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.
Modifiez les autorisations sur le fichier de tâche pour le rendre exécutable.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Étape 5 - Configurer SSL MQTT
Maintenant que nous avons les certificats SSL prêts, nous devons leur fournir un accès Mosquitto. Pour cela, nous devons copier les certificats dans un emplacement à partir duquel Mosquitto peut y accéder.
$ 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
Changer la propriété du /etc/mosquitto/certs
répertoire vers le mosquitto
utilisateur créé lors de l'installation.
$ sudo chown mosquitto: /etc/mosquitto/certs
La prochaine étape pour activer le cryptage SSL pour Mosquitto consiste à spécifier l'emplacement des certificats SSL. Ouvrez le fichier de configuration pour le modifier.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Collez le code suivant à la fin du fichier.
. . . 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
Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité. Assurez-vous de laisser une nouvelle ligne à la fin du fichier.
L'listener 8883
partie configure le programme d'écoute chiffré. Il s'agit du port standard pour MQTT + SSL, appelé MQTTS. Les quatre lignes suivantes spécifient l'emplacement des fichiers SSL.
Redémarrez Mosquitto pour mettre à jour les paramètres.
$ sudo systemctl restart mosquitto
Vous devrez mettre à jour le pare-feu pour autoriser les connexions au port 8883.
$ sudo ufw allow 8883
Ensuite, nous devons tester la fonctionnalité en utilisant le mosquitto_pub
commande.
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
Comme vous pouvez le constater, nous avons inclus certains paramètres supplémentaires, notamment le numéro de port et le chemin d'accès aux certificats SSL. Chaque fois que vous aurez besoin d'utiliser SSL, vous devrez toujours spécifier le nom d'hôte complet, c'est-à-dire mqtt.example.com
au lieu de localhost
sinon, cela donnerait une erreur.
Vous devrez également ajouter le --capath
directif à chaque fois. Il indique au client Mosquitto de rechercher les certificats racine installés par le système d'exploitation.
Étape 6 - Configurer le renouvellement SSL
Certbot renouvellera automatiquement votre certificat avant son expiration. Mais il faut lui dire de copier les certificats renouvelés dans le /etc/mosquitto/certs
répertoire et redémarrez le service Mosquitto.
Nous allons le faire en créant un script shell. Créer un fichier mosquitto-copy.sh
dans le /etc/letsencrypt/renewal-hooks/deploy
répertoire.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Collez-y le code suivant. Remplacez la valeur du MY_DOMAIN
variable avec votre domaine. Le ${RENEWED_LINEAGE}
la variable pointe vers /etc/letsencrypt/live/mqtt.example.com
répertoire lors du renouvellement.
# 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
Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.
Rendre le fichier exécutable.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Ce script sera automatiquement exécuté à chaque renouvellement réussi du certificat.
Si vous utilisez Mosquitto et un serveur Web comme Nginx, vous devez demander à Certbot d'arrêter le serveur avant le renouvellement et de le redémarrer une fois terminé. Pour cela, ouvrez le fichier etc/letsencrypt/renewal/mqtt.example.com.conf
.
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Ajoutez les lignes suivantes à la fin du fichier. Modifiez les commandes en fonction du serveur Web que vous utilisez.
pre_hook = systemctl stop nginx post_hook = systemctl start nginx
Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.
Exécutez une simulation Certbot pour vérifier.
$ sudo certbot renew --dry-run
Si vous ne voyez aucune erreur, cela signifie que tout est défini.
Étape 7 - Configurer les Websockets
Vous pouvez configurer Mosquitto pour utiliser le protocole MQTT à partir de navigateurs utilisant Javascript à l'aide de la fonctionnalité Websockets. Pour l'activer, ouvrez le fichier de configuration.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Collez les lignes suivantes à la fin du fichier.
. . . 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
Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.
Si vous remarquez, il s'agit du même bloc que celui que nous avons utilisé pour activer SSL, à l'exception des champs de numéro de port et de protocole. 8083 est le port le plus couramment utilisé par MQTT pour communiquer avec WebSockets.
Redémarrez le service Mosquitto.
$ sudo systemctl restart mosquitto
Ouvrez le port 8083.
$ sudo ufw allow 8083
Nous devons utiliser un client MQTT basé sur un navigateur pour tester la fonctionnalité WebSockets. Il existe de nombreux clients disponibles, mais nous utiliserons le client HiveMQ Websocket pour notre objectif. Lancez le client dans votre navigateur et vous verrez ce qui suit.
Comme indiqué dans la capture d'écran ci-dessus, remplissez les champs comme indiqué.
- L'hôte doit être le domaine de votre serveur Mosquitto, mqtt.example.com.
- Le port doit être 8083.
- Le champ ClientID peut rester tel quel.
- Le nom d'utilisateur doit être votre nom d'utilisateur Mosquitto.
- Le mot de passe doit être le mot de passe que vous avez créé ci-dessus.
- Vérifiez le SSL boîte.
Appuyez sur Connecter et le client HiveMQ sera connecté à votre serveur Mosquitto.
Une fois connecté, entrez home/lights/kitchen
comme sujet, entrez n'importe quel message et appuyez sur Publier .
Le message apparaîtra dans votre mosquitto_sub
fenêtre de terminal confirmant la connexion réussie.
Cela montre que la mise en œuvre de Websockets est réussie.
Conclusion
Ceci conclut notre configuration d'un serveur MQTT sécurisé, protégé par mot de passe et crypté SSL sur une machine basée sur Ubuntu 20.04. Si vous avez des questions, postez-les dans les commentaires ci-dessous.