Framework ESP32 conçu sécurisé avec mise à jour sur les airs (OTA), cryptage flash, vérification firmeware signée, MQTT et stockage non volatile. Il peut être utilisé pour toutes sortes de projets de développement IoT, qui considèrent une base sécurisée. Pour ce projet, un ESP-Wroom-32 est utilisé.
Une explication complète de l'installation de l'ESP-IDF pour Windows Linux et Mac est disponible sur le guide étape par étape de l'installation ESPRESSIF. Dans ce projet, le chemin Linux avec Ubuntu et Debian a été suivi:
Prérequis:
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
Télécharger et installer:
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh
Utilisez ESP-IDF (doit être exécuté chaque fois qu'un nouveau shell est lancé):
. ~/esp/esp-idf/export.sh
Créez un dossier pour le projet et téléchargez le framework ESP32 à partir de Git:
cd ~/esp
git clone https://github.com/flouflouit/secure_esp
Une courte liste des commandes nécessaires à ce projet. Tous doivent être exécutés dans le dossier Root Project secure_esp .
Le SSID et le mot de passe du WiFi sont configurés dans idf.py menuconfig sous Example Connection Configuration ou directement dans le sdkconfig:
CONFIG_EXAMPLE_WIFI_SSID=""
CONFIG_EXAMPLE_WIFI_PASSWORD=""

Pour le serveur de mise à jour et les certificats de courtier MQTT doivent être créés. Par conséquent, un script Certificate_Creation.sh Bash a été implémenté. Si ce script est exécuté sur le courtier MQTT, les certificats MQTT peuvent être directement copiés dans le dossier Mosquitto. La variable IP doit contenir l'adresse IP du serveur de mise à jour et du courtier MQTT, qui doit être modifié dans le script.
. ~/esp/secure_esp/certificate_creation.sh
Ce script génère la structure des arbres suivante:

De plus, le script copie également les clés et les certificats du dossier du projet ota_certs et mqtt_certs .
Le processus de signature du firmware a besoin d'une clé de signature. Cette touche Sigining est créée avec OpenSSL qui doit être exécutée dans le dossier Root Project secure_esp :
openssl ecparam -name prime256v1 -genkey -noout -out ~/esp/secure_esp/secure_boot_signing_key.pem
Installation du courtier Mosquitto, qui se fait sur Ubuntu Server 20.04 LTS:
sudo apt-get install mosquitto
Installation du client Mosquitto:
sudo apt-get install mosquitto-clients
Une fois le courtier Mosquitto installé, un nouveau fichier nommé secure.conf doit être créé dans le dossier: /etc/mosquitto/conf.d Ce fichier doit contenir les informations suivantes:
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
require_certificate true
use_identity_as_username true
Copiez les certificats ca.crt, server.crt et server.key, créés avec certificate_cretion.sh, au dossier / etc / mosquitto / certs /.
Après cela, le courtier doit être redémarré:
sudo systemctl restart mosquitto.service
Le courtier peut être testé avec l'abonnement d'un sujet et la publication d'un message à ce sujet. L'IP doit être changée en adresse IP du courtier.
mosquitto_sub -h $IP -t "/test" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt
mosquitto_pub -h $IP -t "/test" -m "test-message" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt
Le certificate_creation.sh crée les dossiers MQTT_CERTS et OTA_CERTS. Dans ces dossiers, les certificats et les clés pour le serveur de mise à jour et le serveur MQTT sont automatiquement copiés à partir du répertoire CA créé. Après cela, la adresse IP du courtier MQTT doit être configurée dans le code source du fichier mqtt.c :

Nous utilisons MQTTS et Port 8883 pour une connexion sécurisée sur TLS.
/ ESP / Update / URL - Sujet de publication
mosquitto_pub -h $IP -t "/esp/update/url" -m "https://domain.de:8070/secure_esp.bin" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ ESP / Update / use_url - Sujet de publication
mosquitto_pub -h $IP -t "/esp/update/use_url" -m "1" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ ESP / mise à jour / intervalle - Sujet de publication
mosquitto_pub -h $IP -t "/esp/update/interval" -m "10000" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ ESP / Update / Run - Publier le sujet
mosquitto_pub -h $IP -t "/esp/update/run" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ ESP / Redémarrer - Sujet de publication
mosquitto_pub -h $IP -t "/esp/restart" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ ESP / Log - Sujet abonné
mosquitto_sub -h $IP -t "/esp/log" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt La version du firmware de mise à jour doit être plus élevée que la version du micrologiciel en cours d'exécution. C'est pourquoi le numéro de version doit être augmenté dans le fichier sdkconfig sous CONFIG_APP_PROJECT_VER avant de construire le projet pour la mise à jour OTA. Alternativement, cela peut être fait par idf.py menuconfig sous le gestionnaire d'applications: 
L'URL de mise à niveau du micrologiciel peut être modifiée dans idf.py menuconfig sous une configuration d'exemple ou divertit dans le fichier sdkconfig: CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL

Pendant le processus de construction, le firmware est signé numériquement avec le Secure_Boot_Signing_key.pem:
idf.py build
Après ~/esp/secure_esp/build/secure_esp.bin exécuté cette commande
Si ce n'est pas déjà fait, générez les fichiers Update_cert.pem et Update_cert.pem avec le script Certificate_Creation.sh.
Après cela, ces fichiers doivent être copiés dans un dossier avec le binaire du firmware. Pour démarrer le serveur de mise à jour, la commande suivante est utilisée:
openssl s_server -WWW -key update_key.pem -cert update_cert.pem -port 8070
Pour coder une application pour ce projet, une application de clignotement est incluse dans le code. Cet exemple d'application peut être trouvé le fichier secure_esp.c . Il sera exécuté par le processus principal et s'exécutera dans une boucle sans fin. Pour l'exemple de clignotement, une LED est définie sur GPIO PIN 9. Il s'éteint et se déroule après une seconde. Cet exemple montre comment inclure une application de base à Secure_ESP:

Dans ce projet, le cryptage Flash est activé. Le flash initial doit être fait avec la commande Flash normale:
idf.py -p [port] flash monitor
Ensuite, l'ESP32 ne peut être clignotant qu'avec la commande à flash chiffré:
idf.py -p [port] encrypted-flash monitor
Si le message d'erreur suivant se produit, il est utile d'appuyer sur le bouton de démarrage de l'ESP32 pendant le clignotement:
