Dans la continuité des articles portant sur la technologie MQTT, notamment celui de Romain, nous allons installer un broker MQTT et le sécuriser en utilisant le protocole TLS (Transport Layer Security). Ainsi, les clients souhaitant se connecter au broker MQTT devront être en possession d’un certificat valide. Tous les échanges entre les clients et le broker seront chiffrés à l’aide de ces certificats.
Si vous souhaitez en savoir plus sur le protocole MQTT, Je vous renvoie à mon article sur les protocoles applicatifs de l’Internet des Objets.
Pour ce tutoriel j’utilise un serveur Ubuntu 18.04 ; il se peut que les instructions et les commandes utilisées soient légèrement différentes avec d’autres distributions linux.
Création des certificats
Nous allons dans cette partie, générer les clés et les certificats qui vont nous permettre de sécuriser la communication entre le client et le broker MQTT. En effet, le protocole TLS utilise des certificats et des clés de chiffrement pour respectivement authentifier (s’assurer de l’identité) les acteurs de la communication et chiffrer celle-ci. Lorsque vous lisez cet article, le protocole HTTPS utilise ce mécanisme pour sécuriser les échanges entre le serveur et le client (votre navigateur).
Commençons donc par mettre à jour le serveur en tapant ces commandes dans le terminal:
sudo apt-get update sudo apt-get upgrade -y
Nous allons ensuite créer un dossier dans lequel nous allons générer nos certificats.
mkdir certs cd certs
L’autorité de certification
Nous devons créer une paire de clés publique et privée (Key Pair) ainsi qu’un certificat pour l’autorité de certification (CA). C’est cette autorité qui nous permettra d’authentifier l’identité des correspondants notamment en signant les certificats de notre broker et de notre client.
Pour ce faire nous allons utiliser OpenSSL. Vérifiez que OpenSSL est bien installé sur votre serveur en tapant la commande suivante :
openssl version
Un numéro de version devrait s’afficher. Commençons donc par générer une paire de clés pour l’autorité de certification:
openssl genrsa -out frugalCA.key 2048
Nous utilisons ensuite cette clé (de taille 2048) pour générer le certificat de l’autorité de certification d’une durée de validité de 10 ans (3650 days) :
openssl req -new -x509 -days 3650 -key frugalCA.key -out frugalCA.crt
Plusieurs informations vous seront demandées à la suite de cette commande. Veillez à ne pas laisser vide le champ Common Name.
Pour exemple, ci-dessous les informations que j’ai renseignées:
Maintenant en tapant la commande ls (toujours dans le dossier certs), vous devriez avoir deux fichiers frugalCA.key et frugalCA.crt (si vous avez choisi les mêmes noms que moi).
Le serveur (broker)
Nous allons répéter la même opération ; cette fois-ci pour le serveur (broker). Cependant, nous n’allons pas générer un certificat (.crt) mais plutôt une demande de signature de certificat (.csr). Nous soumettrons ensuite cette demande de signature de certificat (Certificate Request) à l’autorité de certification pour vérification et signature :
openssl genrsa -out frugalServer.key 2048 openssl req -new -out frugalServer.csr -key frugalServer.key
De la même manière, vous devez renseigner des informations pour compléter l’opération. Je vous conseille d’utiliser un Common Name différent pour éviter tout problème.
Nous allons maintenant utiliser la paire de clé et le certificat de l’autorité de certification pour signer et vérifier la demande de signature de certificat du serveur et ainsi générer le certificat du serveur:
openssl x509 -req -in frugalServer.csr -CA frugalCA.crt -CAkey frugalCA.key -CAcreateserial -out frugalServer.crt -days 3650
A la suite de cette commande, votre dossier certs devrait compter 6 fichiers:
- frugalCA.crt
- frugalCA.key
- frugalCA.srl (numéro de série pour le CA)
- frugalServer.crt
- frugalServer.csr
- frugalServer.key
Installation et configuration de Mosquitto
Si vous avez déjà installé Mosquitto, vous pouvez directement passer à l’étape de configuration.
Pour installer mosquitto, tapez la commande suivante :
sudo apt-get install mosquitto -y
Ensuite, éditez le fichier de configuration Mosquitto en tapant cette commande :
sudo nano /etc/mosquitto/mosquitto.conf
Dans ce fichier de configuration, nous allons tout d’abord inscrire le port que nous souhaitons utiliser pour la communication sécurisée MQTT (8883 dans notre cas) ainsi que les liens vers les clés et les certificats (du CA et du serveur). Vérifiez que le port 8883 soit bien ouvert sur votre serveur. Supprimez également la ligne:
« `include_dir /etc/mosquitto/conf.d« `.
Voici mon fichier de configuration mosquitto.conf :
# Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example pid_file /var/run/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log port 8883 cafile /etc/mosquitto/certs/frugalCA.crt certfile /etc/mosquitto/certs/frugalServer.crt keyfile /etc/mosquitto/certs/frugalServer.key require_certificate true
J’ai rencontré un problème à cause d’un espace à la fin du chemin du fichier cafile. Donc si vous ne parvenez pas à vous connecter par la suite, c’est une piste possible.
Nous devons maintenant copier les certificats et les clés que nous avons générés dans le dossier /etc/mosquitto/certs/ auquel nous faisons référence dans le fichier de configuration.
Toujours dans le dossier certs que nous avions créé au début de ce tutoriel, entrez la commande suivante:
sudo cp frugalCA.crt frugalServer.crt frugalServer.key /etc/mosquitto/certs/
La commande suivante devrait lister les trois fichiers copiés: frugalServer.crt ; frugalServer.key et frugalCA.crt :
ls /etc/mosquitto/certs/
Configuration du client
Maintenant, nous allons tester notre broker en configurant un client MQTT. Pour ce faire nous devons aussi générer un certificat et une paire de clé de la même manière que pour le serveur. Nous devons donc récupérer le certificat et les clés du CA pour signer le certificat du client. Ainsi le serveur et le client seront chacun en possession d’un certificat vérifié et signé par le CA.
Je considère à ce stade que vous avez téléchargé la clé et le certificat du CA sur la machine de votre client.
Dans le terminal du client (dans mon cas c’est mon ordinateur portable), tapez les commandes suivantes :
openssl genrsa -out frugalClient.key 2048 openssl req -new -out frugalClient.csr -key frugalClient.key openssl x509 -req -in frugalClient.csr -CA frugalCA.crt -CAkey frugalCA.key -CAcreateserial -out frugalClient.crt -days 3650
Encore une fois, vous devrez entrer des informations concernant la signature. Les informations sont les mêmes que précédemment. Pour le Common Name, vous pouvez utiliser FrugalClient.
Nous devrions avoir dans le dossier du client au moins les fichiers suivants: frugalClient.key ; frugalClient.crt et frugalCA.crt.
Nous sommes maintenant prêts à tester la communication entre le client et le broker.
Test de la communication
Pour tester la communication entre notre client et le broker, nous allons écrire un petit script Node.js (consultez ce lien pour l’installation de Node.js). Dans le dossier de notre client, où se trouve les trois fichiers listés précédemment, nous allons créer un fichier index.js.
touch index.js
Ensuite, copiez le script ci-dessous dans le fichier index.js (N’oubliez pas de remplacer la variable host par l’ip ou le domaine de votre broker):
const mqtt = require('mqtt'); const fs = require('fs'); const PORT = 8883; // REMPLACEZ PAR VOTRE IP const HOST = 'IP de votre broker '; let options = { port: PORT, clientId: `frugal${Math.random().toString(16).substr(2, 8)}`, host: HOST, key: fs.readFileSync('frugalClient.key'), cert: fs.readFileSync('frugalClient.crt'), rejectUnauthorized: false, ca: fs.readFileSync('frugalCA.crt'), protocol: 'mqtts' } const client = mqtt.connect(`${HOST}`, options); client.on('connect', (d) => { console.log('frugal connected'); }); client.on('error', (e) => { console.log(e); })
Nous utilisons la librairie mqtt, nous devons donc l’installer avant de lancer notre script:
npm i mqtt --save
Il ne reste plus qu’à lancer notre script:
node index.js
Logiquement, si tout se passe bien, vous devriez voir apparaître le message suivant dans le terminal du client:
frugal connected
C’est tout pour ce tutoriel. Vous trouverez quelques informations complémentaires et utiles en consultant les liens ci-dessous:
Si vous avez des questions ou des remarques, n’hésitez pas à laisser un commentaire. Comme d’habitude, si des erreurs se sont glissées dans l’article, n’hésitez pas à nous en faire part.
Pour être informé des prochains articles, rendez-vous sur Twitter.
Merci, et à très bientôt sur Frugal Prototype
Ali Benfattoum
Intrapreneur, Tech Enthusiast, IoT Expert, Smart City Specialist…
Suivez moi sur @alifrugal
Bonjour,
Merci @ali pour cet article. J’ai gagné beaucoup de temps !
En revanche, python 3.7 m’en a fait perdre… (librairie paho mqtt)
Si comme moi vous avez l’erreur
« ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for »
Il faut régénérer le certificat coté broker en spécifiant l’url du broker dans le Common Name : il suffit de refaire les 3 commandes du chapitre « Le serveur (broker) »
import paho.mqtt.client as mqtt
import uuid
import ssl
def on_connect(client, userdata, flags, rc):
print(« Connected with result code « +str(rc))
client.subscribe(« # »)
def on_message(client, userdata, msg):
print(msg.topic+ » « +str(msg.payload))
client = mqtt.Client()
client.tls_set(
« frugalCA.crt »,
« frugalClient.crt »,
« frugalClient.key »,
cert_reqs=ssl.CERT_REQUIRED,
tls_version=ssl.PROTOCOL_TLSv1_2
)
client.on_connect = on_connect
client.on_message = on_message
client.connect(« mqtt.frugalprototype.fr », 8883, 60)
client.loop_forever()