Voici un autre changement apparu avec la version Bullseye du système d'exploitation de Raspberry Pi datant de janvier 2022 : le paquet Mosquitto a été mis à jour vers la version 2.0.11. Pour être plus précis, il s'agissait d'un changement "en amont" dans Debian 11 (nom de code "bullseye"). Cette mouture du courtier MQTT gère désormais la version 5.0 du protocole tout en prenant en charge les versions 3.1 et 3.1.1 comme auparavant. Or son comportement par défaut ayant changé, mon système domotique basé sur Domoticz qui communique avec de nombreux appareils IoT à l'aide de messages MQTT, ne fonctionnerait pas sans correctifs si installé dans Raspberry Pi OS (Bullseye).
C'est en cherchant à comprendre pourquoi mon utilitaire lazmqttc n'arrivait pas a se connecter à un serveur Mosquitto 2.0.11 roulant sur un environnement Raspberry Pi OS (Bullseye) de test que j'ai constaté l'existence du problème. J'ai perdu beaucoup de temps à trouver la source du problème qui était pourtant clairement indiquée dans le document intitulé Migrating from 1.x to 2.0 de Eclipse Mosquitto :
- "Lorsque Mosquitto est exécuté sans fichier de configuration ou sans configuration des clients, il se lie désormais aux interfaces 127.0.0.1 et ::1. Cela signifie que seules les connexions à partir de l'hôte local seront possibles."
- "La configuration d'un client doit contenir une authentification."
En plus, le court document fournit des solutions qui, dans mon cas, consistaient à créer un fichier de configuration local, /etc/mosquitto/conf.d/local.conf
. J'aurais tout aussi bien pu ajouter ce qui suit au fichier de configuration global /etc/mosquitto/mosquitto.conf
.
L'ajout d'un client à distance et l'autorisation des connexions anonymes font que la nouvelle version du courtier se comporte comme le faisait par défaut l'ancienne version.
Parce que ce comportement par défaut n'est pas sécurisé, on peut convenir que les changements étaient justifiés. Au minimum, un client doit fournir un identifiant et un mot de passe pour s'authentifier lorsqu'il se connecte au serveur. Ces données doivent se trouver dans un fichier de mots de passe dont le nom complet doit être spécifié dans le fichier de configuration (voir la dernière ligne ci-dessus). Logiquement, on devrait aussi interdire les connexions anonymes. Voici comment créer le fichier de mots de passe avec l'utilitaire mosquitto_passwd
. Le fichier est créé lors de l'ajout d'un premier utilisateur, puis un deuxième utilisateur est ajouté. Notez la présence de l'option -c
de création d'un nouveau fichier lors de l'ajout du premier utilisateur et son absence lors de l'ajout d'utilisateurs et de mots de passe supplémentaires.
Puisque le deux-points ":" sépare l'identifiant du mot de passe, les noms d'utilisateurs ne peuvent pas contenir de deux-points. Il pourrait rapidement devenir fastidieux d'entrer de nombreux identifiants et mots de passe de cette manière, alors regardez l'option -U
dans la page man
pour mosquitto_passwd
(également disponible sur le Web) pour un moyen plus simple de créer un fichier de mots de passe pour de nombreux clients.
Voici le résultat d'un test utilisant mosquitto_rr
qui combine plus ou moins mosquitto_pub
et mosquitto_sub
qui était inclus avec les deux derniers dans le paquet mosquitto-clients
sur mon ordinateur de bureau.
Le paquet mosquitto
propose des méthodes plus sophistiquées pour gérer le contrôle d'accès, l'authentification et le cryptage du nom d'utilisateur et du mot de passe. Si tout cela est nécessaire, alors vous ne seriez évidemment pas en train de lire ce guide des plus élémentaires.
La bonne nouvelle pour moi est que je n'ai pas à réécrire lazmqttc
bien que cette expérience souligne la nécessité d'en améliorer la gestion des erreurs de connexion.