🛠 Secure boot RSA-3072 et chiffrement de la flash
Objetivos
Asegurar una producción ESP32-S2: activar el arranque seguro v2 (firma RSA-3072, la S2 solo acepta este tamaño de clave) que rechaza cualquier firmware no firmado, y el cifrado de la flash (AES-XTS) que hace inútil la lectura del chip sin la clave. Operaciones irreversibles mediante eFuses: probar en una placa de desarrollo dedicada.
Material
- Placa de prueba ESP32-S2 (irreversible: ¡no usar su única placa!)
- Ordenador con ESP-IDF v4.x/v5.x (herramientas espefuse.py y espsecure.py) o los paquetes pip
esptool esptool espsecure espefuse - Cable USB, copia de seguridad de la clave en un lugar seguro
Código completo
// Verification a l'execution de l'etat de securite (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); }
Comandos de quemado de eFuses (leer dos veces antes de ejecutar):
# 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
Verificación esperada
Tras el quemado, el sketch de estado muestra «Arranque seguro activo: SÍ» y «Cifrado de flash activo: SÍ». Un firmware no firmado se niega a arrancar (el monitor serie permanece mudo o muestra un fallo de arranque). Un intento de lectura de la flash con esptool solo devuelve datos cifrados ilegibles.
Errores frecuentes
- Perder la clave de firma: sin ella, ningún firmware podrá ser firmado, la placa queda bloqueada definitivamente; archive la clave sin conexión.
- Intentar usar arranque seguro v1 o una clave más pequeña: la S2 solo acepta RSA-3072 (arranque seguro v2).
- Quemar en la placa equivocada o con el puerto incorrecto: verifique
espefuse.py summaryantes de cadaburn_efuse, todo es irreversible. - Olvidar firmar el bootloader Y la tabla de particiones Y la aplicación: las tres imágenes deben estar firmadas, de lo contrario el arranque falla silenciosamente.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino