🛠 Canal sécurisé : OTAA, MIC et élément ATECC508
Objectifs
Il n'y a pas de TLS sur cette carte (pas de Wi-Fi, donc pas de WiFiSSLClient). L'équivalent « canal sécurisé » est la sécurité LoRaWAN : jointure OTAA avec dérivation de clés, intégrité MIC (AES-128) sur chaque trame, et protection des clés dans l'écosystème MKR (élément ATECC508 embarqué). Ce tuto couvre les bonnes pratiques de clés et la vérification du lien.
Matériel
- 1 Arduino MKR WAN 1300 (élément sécurisé ATECC508 embarqué)
- Serveur LoRaWAN avec App Key forte (128 bits aléatoires, unique par device)
- >
Code complet
#include <MKRWAN.h>
LoRaModem modem;
// En production : NE JAMAIS laisser les cles en clair dans le depot.
// Les stocker hors du code (zone config, element securise) et les regenerer.
String appEui = "0080000000000001";
String appKey = "GENEREE_PAR_TON_SERVEUR_32_HEX";
void setup {
Serial.begin(115200);
if (!modem.begin(EU868)) while (1) {}
// OTAA (mode 1) : derive NwkSKey/AppKey par session, prefere a ABP (mode 0)
if (!modem.joinOTAA(appEui, appKey)) {
Serial.println("Join refuse : vérifier AppEUI/AppKey et couverture");
while (1) {}
}
modem.minPollInterval(60);
modem.linkAdaptiveDataRate(true); // ADR : monte la DR quand le lien est bon
}
void loop {
modem.beginPacket;
modem.print("secure");
// uplink confirmee = ACK signe MIC : preuve de reception integre
bool ok = modem.endPacket(true) > 0;
Serial.print(ok ? "MIC OK " : "MIC ECHEC ");
Serial.print("rssi="); Serial.print(modem.readRSSI);
Serial.print(" snr="); Serial.println(modem.readSNR);
delay(120000);
}
Vérification attendue
La jointure OTAA crée une session fraîche (les clés de session ne circulent jamais en clair) ; les uplinks confirmées reçoivent un ACK dont le MIC valide l'intégrité. Côté serveur, la session change après chaque rejoin.
Erreurs fréquentes
- ABP au lieu d'OTAA : clés statiques rejouables (régression connue de joinABP entre MKRWAN 1.0.14 et 1.0.15, issue #85).
- App Key faible ou partagée entre devices : chaque device doit avoir sa clé unique.
- Croire l'ATECC508 utilisé automatiquement : sans code dédié, les clés restent en clair dans le sketch.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
emission-p2p.inoArduinoreception-p2p.inoArduinoreglage-sp.inoArduinometeo-lora.inoArduinotrame-crc.inoArduinorelais-radio.inoArduino