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:

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 :

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.

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:

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

All author posts
Related Posts

Privacy Preference Center