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». Il est couramment utilisé pour la géolocalisation de parcs de véhicules, la domotique, les réseaux de capteurs environnementaux et la collecte de données à grande échelle.
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, nous allons installer Mosquitto, récupérer les certificats SSL de Let’s Encrypt et configurer notre courtier pour qu’il utilise SSL afin de sécuriser nos communications MQTT protégées par mot de passe.
Conditions préalables
Avant de commencer ce tutoriel, vous aurez besoin de:
-
Un serveur CentOS 7 avec un utilisateur non-root, activé par sudo et un pare-feu de base. Tout cela (et plus) est couvert dans lesNew CentOS 7 Server Checklist.
-
Un nom de domaine pointé vers votre serveur, selonHow to Set Up a Host Name with DigitalOcean. Ce didacticiel utilisera
mqtt.example.com
partout. -
En option, l'éditeur de texte
nano
. Ce tutoriel utiliseranano
partout et vous pourrez l'installer à tout moment avecsudo yum -y install nano
, ou remplacer votre éditeur de texte préféré.
[[step-1 -—- Installing-mosquitto]] == Étape 1 - Installation de Mosquitto
CentOS 7 n'a pas de packagemosquitto
par défaut. Pour l’installer, nous allons d’abord installer un référentiel de logiciels supplémentaire appelé Extra Packages for Enterprise Linux ou EPEL. Ce référentiel regorge de logiciels supplémentaires qui s’installent bien sur CentOS, Red Hat et d’autres distributions Linux orientées entreprise.
Connectez-vous avec votre utilisateur non root et utilisez le gestionnaire de packagesyum
pour installer le packageepel-release
.
sudo yum -y install epel-release
Cela ajoute les informations du référentiel EPEL à notre système. L'option-y
répond automatiquement oui à quelques invites tout au long du processus. Nous pouvons maintenant installer le packagemosquitto
.
sudo yum -y install mosquitto
Le paquet est livré avec une configuration par défaut simple, alors exécutons-le pour tester notre installation.
sudo systemctl start mosquitto
Nous devons également activer le service pour qu'il démarre correctement lorsque nous redémarrons le système:
sudo systemctl enable mosquitto
Maintenant, testons la configuration par défaut. Le packagemosquitto
est fourni avec certains clients MQTT en ligne de commande. Nous en utiliserons l’un pour s’abonner à un sujet de notre courtier.
Topics sont des libellés auxquels vous publiez des messages et auxquels vous vous abonnez. Ils sont organisés sous forme de hiérarchie, vous pouvez donc avoirsensors/outside/temp
etsensors/outside/humidity
, par exemple. La façon dont vous organisez les sujets dépend de vous et de vos besoins. Tout au long de ce tutoriel, nous utiliserons un sujet de test simple pour tester nos modifications de configuration.
Connectez-vous une seconde fois à votre serveur pour disposer de deux terminaux côte à côte. Dans le nouveau terminal, utilisezmosquitto_sub
pour vous abonner au sujet de test:
mosquitto_sub -h localhost -t test
-h
est utilisé pour spécifier le nom d'hôte du serveur MQTT et-t
est le nom de la rubrique. Vous ne verrez aucune sortie après avoir frappéENTER
carmosquitto_sub
attend l'arrivée des messages. Revenez sur votre autre terminal et publiez un message:
mosquitto_pub -h localhost -t test -m "hello world"
Les options pourmosquitto_pub
sont les mêmes que pourmosquitto_sub
, bien que cette fois nous utilisons l'option-m
supplémentaire pour spécifier notre message. Appuyez surENTER
et vous devriez voir apparaîtrehello world dans l'autre terminal. Vous avez envoyé votre premier message MQTT!
EntrezCTRL+C
dans le second terminal pour quittermosquitto_sub
, mais gardez la connexion au serveur ouverte. Nous allons l’utiliser à nouveau pour un autre test à l’étape 5.
Ensuite, nous allons sécuriser notre installation avec SSL en utilisant Certbot, le nouveau client Let’s Encrypt.
[[step-2 -—- Installing-and-Running-certbot-for-let-39-s-encrypt-certificates]] == Étape 2 - Installation et exécution de Certbot pour les certificats Let’s Encrypt
Let’s Encrypt est un nouveau service proposant des certificats SSL gratuits via une API automatisée. Le client officiel Let’s Encrypt s'appelle Certbot et il est inclus dans le référentiel EPEL que nous avons installé à l'étape précédente.
Installez Certbot avecyum
.
sudo yum -y install certbot
Certbot doit répondre à un défi cryptographique émis par l’API Let’s Encrypt afin de prouver que nous contrôlons notre domaine. Il utilise les ports80
(HTTP) et / ou443
(HTTPS) pour ce faire. Nous n'utiliserons que le port80
, alors autorisons maintenant le trafic entrant sur ce port.
Utilisezfirewall-cmd
pour ajouter le service HTTP.
sudo firewall-cmd --permanent --add-service=http
Rechargez le pare-feu pour que les modifications prennent effet.
sudo firewall-cmd --reload
Nous pouvons maintenant exécuter Certbot pour obtenir notre certificat. Nous utiliserons l'option--standalone
pour indiquer à Certbot de gérer lui-même la demande de défi HTTP, et--standalone-supported-challenges http-01
limite la communication au port80
. -d
est utilisé pour spécifier le domaine pour lequel vous souhaitez obtenir un certificat, etcertonly
indique à Certbot de simplement récupérer le certificat sans effectuer aucune autre étape de configuration.
sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com
Lors de l'exécution de la commande, 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 avons nos certificats. Nous devons maintenant nous assurer que Certbot les renouvelle automatiquement au moment de leur expiration.
[[step-3 -—- setting-up-certbot-automatic-renewals]] == Étape 3 - Configuration des renouvellements automatiques Certbot
Les certificats de Let Encrypt ne sont valables que quatre-vingt-dix jours. Cela encourage les utilisateurs à automatiser leur processus de renouvellement des certificats. Nous devons définir une commande d'exécution régulière pour vérifier l'expiration des certificats et les renouveler automatiquement.
Pour exécuter le contrôle de renouvellement tous les jours, nous utiliseronscron
, un service système standard pour exécuter des travaux périodiques. Nous disons àcron
ce qu'il faut faire en ouvrant et en éditant un fichier appelécrontab
.
sudo EDITOR=nano crontab -e
EDITOR=nano
ouvrira le fichier crontab dans l'éditeurnano
. Laissez-le désactivé si vous préférez l’éditeur par défaut devi
.
Vous devriez maintenant être présenté avec lecrontab
par défaut, un fichier vide. Collez dans la ligne suivante, puis enregistrez et fermez le fichier.
crontab
15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"
La partie15 3 * * *
de cette ligne signifie «exécuter la commande suivante à 3 h 15, tous les jours». La commanderenew
pour Certbot vérifie tous les certificats installés sur le système et met à jour ceux qui sont configurés pour expirer dans moins de trente jours. --noninteractive
dit à Certbot de ne pas attendre l'entrée de l'utilisateur.
--post-hook "systemctl restart mosquitto"
redémarrera Mosquitto pour récupérer le nouveau certificat, mais uniquement si le certificat a été renouvelé.
Maintenant que le renouvellement automatique du certificat est terminé, nous allons revenir à la configuration de Mosquitto pour qu'il soit plus sécurisé.
[[step-4 -—- configuring-mqtt-passwords]] == Étape 4 - Configuration des mots de passe MQTT
Configurons Mosquitto pour utiliser des mots de passe. Mosquitto inclut un utilitaire pour générer un fichier de mot de passe spécial appelémosquitto_passwd
. Cette commande vous invitera à entrer un mot de passe pour le nom d'utilisateur spécifié et à placer les résultats dans/etc/mosquitto/passwd
.
sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
Nous allons maintenant remplacer le fichier de configuration par défaut et indiquer à Mosquitto d’utiliser ce fichier de mots de passe pour exiger des connexions pour toutes les connexions. Tout d'abord, supprimez lesmosquitto.conf
existants.
sudo rm /etc/mosquitto/mosquitto.conf
Et ouvrez maintenant une nouvelle config vierge.
sudo nano /etc/mosquitto/mosquitto.conf
Coller dans ce qui suit.
/etc/mosquitto/mosquitto.conf
allow_anonymous false
password_file /etc/mosquitto/passwd
allow_anonymous false
désactivera toutes les connexions non authentifiées et la lignepassword_file
indique à Mosquitto où chercher les informations sur l'utilisateur et le mot de passe. Enregistrez et quittez le fichier.
Nous devons maintenant redémarrer Mosquitto et tester nos modifications.
sudo systemctl restart mosquitto
Essayez de publier un message sans mot de passe.
mosquitto_pub -h localhost -t "test" -m "hello world"
Le message devrait être rejeté:
OutputConnection Refused: not authorised.
Error: The connection was refused.
Avant de réessayer avec le mot de passe, revenez à la fenêtre de votre deuxième terminal et abonnez-vous à la rubrique "test", en utilisant le nom d'utilisateur et le mot de passe cette fois:
mosquitto_sub -h localhost -t test -u "sammy" -P "password"
Il devrait se connecter et s'asseoir, en attente de messages. Vous pouvez laisser ce terminal ouvert et connecté pendant le reste du didacticiel, car nous lui enverrons périodiquement des messages de test.
Publiez maintenant un message avec votre autre terminal, en utilisant à nouveau le nom d'utilisateur et le mot de passe:
mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"
Le message devrait passer comme à l'étape 1. Nous avons ajouté avec succès la protection par mot de passe à Mosquitto. Malheureusement, nous envoyons des mots de passe non cryptés sur Internet. Nous allons résoudre ce problème en ajoutant le cryptage SSL à Mosquitto.
[[step-5 -—- configuring-mqtt-ssl]] == Étape 5 - Configuration de MQTT SSL
Pour activer le cryptage SSL, nous devons indiquer à Mosquitto où sont stockés nos certificats Let’s Encrypt. Ouvrez le fichier de configuration que nous avons précédemment lancé.
sudo nano /etc/mosquitto/mosquitto.conf
Collez ce qui suit à la fin du fichier, en laissant les deux lignes que nous avons déjà ajoutées:
/etc/mosquitto/mosquitto.conf
. . .
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
Nous ajoutons deux blocslistener
séparés à la configuration. Le premier,listener 1883 localhost
, met à jour l'écouteur MQTT par défaut sur le port1883
, auquel nous nous sommes connectés jusqu'à présent. 1883
est le port MQTT non chiffré standard. La partielocalhost
de la ligne indique à Mosquitto de ne lier ce port qu'à l'interface localhost, de sorte qu'il n'est pas accessible de l'extérieur. Les demandes externes auraient de toute façon été bloquées par notre pare-feu, mais il est bon d’être explicite.
listener 8883
configure un écouteur chiffré sur le port8883
. Il s'agit du port standard pour MQTT + SSL, souvent appelé MQTTS. Les trois lignes suivantes,certfile
,cafile
etkeyfile
, pointent toutes Mosquitto vers les fichiers Let’s Encrypt appropriés pour configurer les connexions chiffrées.
Enregistrez et quittez le fichier.
Avant de redémarrer Mosquitto pour charger la nouvelle configuration, nous devons corriger une chose dans le fichier de service par défautmosquitto
. C'est le fichier quesystemd
utilise pour déterminer comment exécutermosquitto
. Ouvrez-le dans votre éditeur préféré.
sudo nano /etc/systemd/system/multi-user.target.wants/mosquitto.service
Recherchez une ligne indiquantUser=mosquitto
et supprimez-la, puis enregistrez et quittez le fichier.
Mosquitto fonctionnera toujours en tant qu'utilisateurmosquitto, mais lors de son premier démarrage, il disposera des privilègesroot et pourra charger nos certificats Let's Encrypt (qui sont limités àroot accès, pour des raisons de sécurité). Après avoir chargé les certificats, il reviendra à l'utilisateurmosquitto.
Nous devons rechargersystemd
lui-même pour qu'il remarque les modifications que nous avons apportées au fichier de service.
sudo systemctl daemon-reload
Et maintenant, nous pouvons redémarrer Mosquitto pour mettre à jour les paramètres.
sudo systemctl restart mosquitto
Mettez à jour le pare-feu pour autoriser les connexions au port8883
.
sudo firewall-cmd --permanent --add-port=8883/tcp
Et rechargez le pare-feu.
sudo firewall-cmd --reload
Maintenant, nous testons à nouveau en utilisantmosquitto_pub
, avec quelques options différentes pour SSL.
mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --cafile /etc/ssl/certs/ca-bundle.crt -u "sammy" -P "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 disant que le nom d'hôte ne correspond pas au nom d'hôte du certificat (même s'ils pointent tous les deux vers le même Mosquitto serveur).
--cafile /etc/ssl/certs/ca-bundle.crt
active SSL pourmosquitto_pub
et lui indique où chercher les certificats racine. Celles-ci sont généralement installées par votre système d'exploitation, le chemin est donc différent pour Mac OS, Windows, etc. mosquitto_pub
utilise le certificat racine pour vérifier que le certificat du serveur Mosquitto a été correctement signé par l’autorité de certification Let’s Encrypt. Il est important de noter quemosquitto_pub
etmosquitto_sub
ne tenteront pas de connexion SSL sans cette option (ou l'option similaire--capath
), même si vous vous connectez au port sécurisé standard de8883
.
Si tout se passe bien avec le test, nous verronshello again apparaître dans l’autre terminalmosquitto_sub
. Cela signifie que votre serveur est entièrement configuré! Si vous souhaitez étendre le protocole MQTT pour qu’il fonctionne avec des websockets, vous pouvez suivre la dernière étape.
[[step-6 -—- configuring-mqtt-over-websockets-optional]] == Étape 6 - Configuration de MQTT via Websockets (facultatif)
Afin de parler MQTT à l'aide de JavaScript à partir de navigateurs Web, le protocole a été adapté pour fonctionner sur des Websockets standard. Si vous n’avez pas besoin de cette fonctionnalité, vous pouvez ignorer cette étape.
Nous devons ajouter un autre bloclistener
à notre configuration Mosquitto.
sudo nano /etc/mosquitto/mosquitto.conf
A la fin du fichier, ajoutez ce qui suit:
/etc/mosquitto/mosquitto.conf
. . .
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
C'est pratiquement le même que le bloc précédent, à l'exception du numéro de port et de la ligneprotocol websockets
. Il n'y a pas de port standardisé officiel pour MQTT sur les Websockets, mais8083
est le plus courant.
Enregistrez et quittez le fichier, puis redémarrez Mosquitto.
sudo systemctl restart mosquitto
Maintenant, ouvrez le port8083
dans le pare-feu.
sudo firewall-cmd --permanent --add-port=8083/tcp
Et rechargez le pare-feu une dernière fois.
sudo firewall-cmd --reload
Pour tester cette fonctionnalité, nous allons utiliser un client MQTT public basé sur un navigateur. Il y en a quelques-uns, maismqtt-admin est simple et direct. Open mqtt-admin in your browser. Vous verrez ce qui suit:
Remplissez les informations de connexion comme suit:
-
Protocol doit êtrewss (ce qui signifiewebsocketsecure).
-
Host doit être le domaine de votre serveur Mosquitto,
mqtt.example.com
. -
Port doit être
8083
. -
User doit être votre nom d'utilisateur Mosquitto; ici, nous avons utilisésammy.
-
Password doit être le mot de passe que vous avez choisi.
-
ClientId peut être laissé à la valeur par défaut,mqtt-admin.
Après avoir appuyé surSave Settings,mqtt-admin
se connectera à votre serveur Mosquitto. Dans l'écran suivant, remplissezTopic commetest, entrez n'importe quel message pourPayload, puis appuyez surPublish. Le message apparaîtra dans le terminalmosquitto_sub
.
Conclusion
Nous avons maintenant configuré un serveur MQTT sécurisé, protégé par un mot de passe, avec renouvellement automatique des certificats SSL à partir du service Let’s Encrypt. Cela servira de plate-forme de messagerie robuste et sécurisée pour tous les projets que vous rêvez. Certains logiciels et matériels courants qui fonctionnent bien avec le protocole MQTT comprennent:
-
OwnTracks, une application de géolocalisation open source que vous pouvez installer sur votre téléphone. OwnTracks transmettra périodiquement des informations de position à votre serveur MQTT, que vous pourrez ensuite stocker et afficher sur une carte, ou créer des alertes et activer le matériel IoT en fonction de votre emplacement.
-
Node-RED est une interface graphique basée sur un navigateur pour «câbler» l’Internet des objets. Vous faites glisser la sortie d'un nœud vers l'entrée d'un autre et vous pouvez acheminer des informations via des filtres, entre divers protocoles, dans des bases de données, etc. MQTT est très bien supporté par Node-RED.
-
LeESP8266 est un microcontrôleur wifi peu coûteux avec des capacités MQTT. Vous pouvez en câbler une pour publier des données de température sur un sujet, ou peut-être souscrire à un sujet de pression barométrique et faire retentir une sonnerie lorsqu'un orage arrive!
Ce ne sont que quelques exemples populaires de l'écosystème MQTT. Il y a beaucoup plus de matériel et de logiciels qui parlent le protocole. Si vous avez déjà une plate-forme matérielle favorite ou un langage logiciel, celle-ci dispose probablement des fonctionnalités MQTT. Amusez-vous à parler de vos «choses»!