introduction
MQTT est un protocole de messagerie de machine à machine, conçu pour fournir une communication de publication / abonnement légère aux périphériques «Internet des objets». Mosquitto est un serveur MQTT populaire (oubroker, dans le langage MQTT) qui bénéficie d'un excellent support communautaire et est facile à installer et à configurer.
Dans ce didacticiel de démarrage rapide condensé, nous installerons et configurerons Mosquitto et utiliserons les certificats SSL de Let’Encrypt pour sécuriser notre trafic MQTT. Si vous avez besoin d'une couverture plus approfondie de l'une des étapes, veuillez consulter les didacticiels suivants:
Conditions préalables
Avant de commencer ce tutoriel, vous aurez besoin de:
-
Un serveur Ubuntu 18.04 avec un utilisateur non root, compatible sudo et un pare-feu de base configuré, comme détaillé dansthis Ubuntu 18.04 server setup tutorial
-
Un nom de domaine pointé sur votre serveur. Ce didacticiel utilisera l'espace réservé
mqtt.example.com
tout au long -
Le port 80 doit être inutilisé sur votre serveur. Si vous installez Mosquitto sur une machine avec un serveur Web qui occupe ce port, vous devrez utiliser une méthode différente pour récupérer les certificats, comme leswebroot mode de Certbot.
[[step-1 -—- installation-du-logiciel]] == Étape 1 - Installation du logiciel
Nous allons d’abord installer un référentiel logiciel personnalisé pour obtenir la dernière version de Certbot, le client Let’s Encrypt:
sudo add-apt-repository ppa:certbot/certbot
Appuyez surENTER
pour accepter, puis installez les packages logiciels pour Mosquitto et Certbot:
sudo apt install certbot mosquitto mosquitto-clients
Ensuite, nous allons chercher notre certificat SSL.
[[step-2 -—- download-an-ssl-certificate]] == Étape 2 - Téléchargement d'un certificat SSL
Ouvrez le port80
dans votre pare-feu:
sudo ufw allow 80
Ensuite, exécutez Certbot pour récupérer le certificat. Assurez-vous de remplacer le nom de domaine de votre serveur ici:
sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com
Vous serez invité à entrer une adresse électronique et à accepter les conditions d'utilisation. Après cela, vous devriez voir un message vous informant que le processus a abouti et où vos certificats sont stockés.
Nous allons configurer Mosquitto pour utiliser ces certificats ensuite.
[[step-3 -—- configuring-mosquitto]] == Étape 3 - Configuration de Mosquitto
Nous allons d’abord créer un fichier de mots de passe que Mosquitto utilisera pour authentifier les connexions. Utilisezmosquitto_passwd
pour ce faire, en veillant à remplacer votre propre nom d'utilisateur préféré:
sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username
Vous serez invité deux fois pour un mot de passe.
Ouvrez maintenant un nouveau fichier de configuration pour Mosquitto:
sudo nano /etc/mosquitto/conf.d/default.conf
Cela ouvrira un fichier vide. Coller dans ce qui suit:
/etc/mosquitto/conf.d/default.conf
allow_anonymous false
password_file /etc/mosquitto/passwd
listener 1883 localhost
listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
Assurez-vous de remplacer le nom de domaine que vous avez utilisé à l'étape 2 parmqtt.example.com
. Enregistrez et fermez le fichier lorsque vous avez terminé.
Ce fichier fait ce qui suit:
-
Désactiver les connexions anonymes
-
Utilise notre fichier de mots de passe pour activer l'authentification par mot de passe
-
Configure un écouteur non sécurisé sur le port 1883 pourlocalhost uniquement
-
Configure un écouteur sécurisé sur le port
8883
-
Configure un écouteur sécurisé basé sur Websocket sur le port
8083
Redémarrez Mosquitto pour prendre en compte les modifications de configuration:
sudo systemctl restart mosquitto
Vérifiez que le service fonctionne à nouveau:
sudo systemctl status mosquitto
Output● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
Loaded: loaded (/etc/init.d/mosquitto; generated)
Active: active (running) since Mon 2018-07-16 15:03:42 UTC; 2min 39s ago
Docs: man:systemd-sysv-generator(8)
Process: 6683 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
Process: 6699 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 1152)
CGroup: /system.slice/mosquitto.service
└─6705 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
L'état doit êtreactive (running)
. Si ce n’est pas le cas, vérifiez votre fichier de configuration et redémarrez-le à nouveau. Certaines informations supplémentaires peuvent être disponibles dans le fichier journal de Mosquitto:
sudo tail /var/log/mosquitto/mosquitto.log
Si tout va bien, utilisezufw
pour autoriser les deux nouveaux ports à traverser le pare-feu:
sudo ufw allow 8883
sudo ufw allow 8083
Maintenant que Mosquitto est configuré, nous allons configurer Certbot pour qu'il redémarre Mosquitto après le renouvellement de nos certificats.
[[step-4 -—- configuring-certbot-renewals]] == Étape 4 - Configuration des renouvellements de Certbot
Certbot renouvellera automatiquement nos certificats SSL avant leur expiration, mais il faut lui demander de redémarrer le service Mosquitto après l'avoir fait.
Ouvrez le fichier de configuration du renouvellement de Certbot pour votre nom de domaine:
sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Ajoutez l'optionrenew_hook
suivante sur la dernière ligne:
/etc/letsencrypt/renewal/mqtt.example.com.conf
renew_hook = systemctl restart mosquitto
Enregistrez et fermez le fichier, puis exécutez une analyse à blanc pour vérifier que la syntaxe est correcte:
sudo certbot renew --dry-run
Si vous ne voyez aucune erreur, vous êtes tous ensemble. Essayons ensuite notre serveur MQTT.
[[step-5 -–- testing-mosquitto]] == Étape 5 - Test de Mosquitto
Nous avons installé des clients MQTT en ligne de commande à l’étape 1. Nous pouvons nous abonner au sujettest sur l'écouteur localhost comme ceci:
mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"
Et nous pouvons publier avecmosquitto_pub
:
mosquitto_pub -h localhost -t test -m "hello world" -u "your-user" -P "your-password"
Pour vous abonner à l'aide de l'écouteur sécurisé sur le port 8883, procédez comme suit:
mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"
Et voici comment vous publiez sur l'auditeur sécurisé:
mosquitto_pub -h mqtt.example.com -t test -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"
Notez que nous utilisons le nom d'hôte complet au lieu delocalhost
. Comme notre certificat SSL est émis pourmqtt.example.com
, si nous tentons une connexion sécurisée àlocalhost
, nous obtiendrons une erreur indiquant que le nom d'hôte ne correspond pas au nom d'hôte du certificat.
Pour tester la fonctionnalité websocket, nous utiliserons un client MQTT public basé sur un navigateur. Open the Eclipse Paho javascript client utility in your browser et remplissez les informations de connexion comme suit:
-
Host est le domaine de votre serveur Mosquitto,
mqtt.example.com
-
Port est
8083
-
ClientId peut être laissé à la valeur aléatoire par défaut
-
Path peut être laissé à la valeur par défaut de/ws
-
Username est votre nom d'utilisateur Mosquitto de l'étape 3
-
Password est le mot de passe que vous avez choisi à l'étape 3
Les champs restants peuvent être laissés à leurs valeurs par défaut.
Après avoir appuyé surConnect, le client se connectera à votre serveur. Vous pouvez publier et vous abonner à l'aide des voletsSubscribe etPublish Message sous le voletConnection.
Conclusion
Nous avons maintenant configuré et testé un serveur MQTT sécurisé, protégé par un mot de passe et chiffré par SSL. Cela peut servir de plate-forme de messagerie robuste et sécurisée pour vos projets IoT, domotique ou autres.