🛠 Secure boot RSA-3072 et chiffrement de la flash
Objectifs
Sécuriser une production ESP32-S2 : activer le secure boot v2 (signature RSA-3072, la S2 n'accepte que cette taille de clé) qui refuse tout firmware non signé, et le chiffrement de la flash (AES-XTS) qui rend la lecture de la puce inutile sans la clé. Opérations irréversibles via les eFuses : à tester sur une carte de développement dédiée.
Matériel
- Carte ESP32-S2 de test (irréversible : ne pas utiliser votre seule carte !)
- Ordinateur avec ESP-IDF v4.x/v5.x (outils espefuse.py et espsecure.py) ou les wheels pip
esptool esptool espsecure espefuse - Câble USB, sauvegarde de la clé dans un endroit sûr
Code complet
// Verification a l'exécution de l'état de sécurité (Arduino-ESP32)
#include <esp_secure_boot.h>
#include <esp_flash_encryption.h>
void setup {
Serial.begin(115200);
delay(1000);
Serial.printf("Secure boot actif : %s\n",
esp_secure_boot_enabled ? "OUI" : "NON");
Serial.printf("Chiffrement flash actif : %s\n",
esp_flash_encryption_enabled ? "OUI" : "NON");
}
void loop { delay(5000); }
Commandes de frittage des eFuses (à lire deux fois avant d'exécuter) :
# 1. Genere la cle de signature RSA-3072 (secure boot v2)
espsecure.py generate_signing_key --version 2 ma_cle.pem
# 2. Convertit le binaire signe
espsecure.py sign_data --version 2 --keyfile ma_cle.pem --output firmware_signed.bin firmware.bin
# 3. Grave la cle dans les eFuses puis active le secure boot
espefuse.py --port COM3 burn_key secure_boot_v2_0 ma_cle.bin
espefuse.py --port COM3 burn_efuse SECURE_BOOT_ENABLE
# 4. Chiffrement de la flash (AES-XTS)
espefuse.py --port COM3 burn_key flash_encryption cle_flash.bin
espefuse.py --port COM3 burn_efuse FLASH_CRYPT_CONFIG 0xF
espefuse.py --port COM3 burn_efuse FLASH_ENCRYPT
Vérification attendue
Après frittage, le sketch d'état affiche « Secure boot actif : OUI » et « Chiffrement flash actif : OUI ». Un firmware non signé refuse de démarrer (le moniteur série reste muet ou affiche un échec de boot). Une tentative de lecture de la flash avec esptool ne sort que des données chiffrées illisibles.
Erreurs fréquentes
- Perdre la clé de signature : sans elle, plus aucun firmware ne pourra être signé, la carte est définitivement verrouillée ; archivez la clé hors ligne.
- Essayer du secure boot v1 ou une clé plus petite : le S2 n'accepte que RSA-3072 (secure boot v2).
- Frittage sur la mauvaise carte ou avec le mauvais port : vérifiez
espefuse.py summaryavant chaqueburn_efuse, tout est irréversible. - Oublier de signer le bootloader ET la table de partitions ET l'application : les trois images doivent être signées, sinon le boot échoue silencieusement.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino