DRAFT — Preliminary version, do not share. · Version préliminaire, ne pas partager.

Se connecter via MQTTS

Cette page vous explique comment ouvrir une connexion MQTT 5 depuis un appareil provisionné vers Fundamentum : paramètres TLS, identifiant client et JWT que l'appareil signe avec sa propre clé. Elle précise également quels topics l'appareil peut atteindre.

Sécurité des appareils : chaque appareil s'authentifie avec sa propre clé

Avant de commencer

Si vous préférez ne pas l'implémenter vous-même, le daemon Linux et la bibliothèque MCU gèrent la connexion à votre place.

Paramètres de connexion

Paramètre Valeur
Hôte mqtts.fundamentum-iot.com
Port 8883 (TLS)
Protocole MQTT 5
TLS Certificat serveur uniquement ; aucun certificat client
Server Name Indication (SNI) Obligatoire : envoyez mqtts.fundamentum-iot.com
CA à approuver ISRG Root X1 (isrgrootx1.pem de Let's Encrypt)
Identifiant client projects/<project-id>/regions/1/registries/<registry-id>/devices/<serial-number>
Nom d'utilisateur unused
Mot de passe Un JWT signé avec la clé privée de l'appareil

1. Intégrer la CA

Téléchargez isrgrootx1.pem depuis Let's Encrypt et intégrez-le à votre micrologiciel. Pour inspecter la chaîne de certificats présentée par le broker :

openssl s_client -showcerts -verify 5 -connect mqtts.fundamentum-iot.com:8883

La plupart des bibliothèques envoient le SNI automatiquement. Sur les modems bare-metal, définissez explicitement le nom SNI dans la configuration TLS ; sans lui, la négociation échoue.

Si l'appareil télécharge également des fichiers de micrologiciel, intégrez aussi DigiCert Global Root G2 : les fichiers de micrologiciel sont servis sous cette racine. Consultez Firmware updates (OTA).

2. Signer le JWT de l'appareil

Le mot de passe est un JWT signé avec RS256 à l'aide de la clé privée de l'appareil. Il contient trois claims obligatoires :

Claim Valeur
aud L'ID du projet, sous forme de chaîne (par exemple, "123")
iat Date d'émission, en secondes Unix
exp Date d'expiration, en secondes Unix

Par exemple, en Python avec PyJWT :

import time
import jwt

now = int(time.time())
claims = {"aud": "<project-id>", "iat": now, "exp": now + 3600}
with open("rsa_private.pem") as f:
    token = jwt.encode(claims, f.read(), algorithm="RS256")
print(token)

Le même JWT authentifie l'appareil sur l'alternative HTTPS et lors de la recherche dans le registre des appareils en stock.

3. Se connecter

Utilisez l'identifiant client qui identifie votre appareil. La forme courte <project-id>.1.<registry-id>.<serial-number> est également acceptée lorsque la longueur de l'identifiant client est limitée.

Par exemple, avec le client Mosquitto, abonnez-vous à la configuration de l'appareil :

mosquitto_sub -V mqttv5 \
  -h mqtts.fundamentum-iot.com -p 8883 --cafile isrgrootx1.pem \
  -i "projects/<project-id>/regions/1/registries/<registry-id>/devices/<serial-number>" \
  -u unused -P "$JWT" \
  -t "registries/<registry-id>/devices/<serial-number>/config"

Le broker refuse la connexion lorsque la signature du JWT ne correspond pas à la clé enregistrée de l'appareil, ou lorsque aud ne correspond pas au projet figurant dans l'identifiant client. Signez un nouveau JWT avant chaque reconnexion.

4. Rester dans les topics de l'appareil

Un appareil ne peut publier et s'abonner que sous son propre préfixe :

registries/<registry-id>/devices/<serial-number>/
Direction Suffixe du topic Objet
Publication events, events/<name> Télémétrie
Publication states États
Publication heartbeat Heartbeat
Publication subdevices/<sub-serial-number>/events Télémétrie d'un sous-appareil
Publication commands/<id> Résultat d'une commande
Abonnement config Configuration de l'appareil, envoyée lors de l'abonnement
Abonnement commands Commandes
Abonnement actions, custom_actions, custom_actions/<name> Actions

La redirection de ports, les réponses aux actions et les formats de messages sont décrits dans MQTT topics and message formats.

Étapes suivantes