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:

Nous allons ensuite créer un dossier dans lequel nous allons générer nos certificats.

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 :

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:

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) :

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:

Création du certificat pour l’autorité de certification

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 :

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.

Création de la demande de signature de certificat pour le broker

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:

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 :

Ensuite, éditez le fichier de configuration Mosquitto en tapant cette commande :

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 :

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:

La commande suivante devrait lister les trois fichiers copiés:  frugalServer.crt  ;  frugalServer.key et  frugalCA.crt :

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 :

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.

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):

Nous utilisons la librairie mqtt, nous devons donc l’installer avant de lancer notre script: 

Il ne reste plus qu’à lancer notre script:

Logiquement, si tout se passe bien, vous devriez voir apparaître le message suivant dans le terminal du client:

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