Secure Design ESP32-Framework mit Update Over the Air (OTA), Flash-Verschlüsselung, signierte Festeware-Überprüfung, MQTT und nichtflüchtiger Speicher. Es kann für alle Arten von IoT -Entwicklungsprojekten verwendet werden, die eine sichere Basis betrachten. Für dieses Projekt wird ein ESP-W-Room-32 verwendet.
Eine vollständige Erläuterung der Installation des ESP-IDF für Windows Linux und MAC finden Sie im Schritt-für-Schritt-Anleitung für die Espressif-Installation. In diesem Projekt wurde der Linux -Pfad mit Ubuntu und Debian verfolgt:
Voraussetzungen:
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
Herunterladen und installieren:
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh
Verwenden Sie ESP-IDF (muss jedes Mal ausgeführt werden, wenn eine neue Shell gestartet wird):
. ~/esp/esp-idf/export.sh
Erstellen Sie einen Ordner für das Projekt und laden Sie das ESP32 -Framework von Git herunter:
cd ~/esp
git clone https://github.com/flouflouit/secure_esp
Eine kurze Liste der Befehle, die für dieses Projekt erforderlich sind. Alle müssen im Stammprojektordner secure_esp ausgeführt werden.
Das SSID und das Kennwort für das WiFi sind im idf.py menuconfig unter Example Connection Configuration oder direkt in der SDKConfig konfiguriert:
CONFIG_EXAMPLE_WIFI_SSID=""
CONFIG_EXAMPLE_WIFI_PASSWORD=""

Für den UPDATE -Server und die MQTT -Broker müssen Zertifikate erstellt werden. Daher wurde ein Certificate_Creation.sh Bash -Skript implementiert. Wenn dieses Skript im MQTT -Broker ausgeführt wird, können die MQTT -Zertifikate direkt in den Mosquitto -Ordner kopiert werden. Die IP -Variable muss die IP -Angabelung des Update -Servers und des MQTT -Broker enthalten, der im Skript bearbeitet werden muss.
. ~/esp/secure_esp/certificate_creation.sh
Dieses Skript erzeugt die folgende Baumstruktur:

Darüber hinaus kopiert das Skript auch die Schlüssel und Zertifikate in den Projektordner ota_certs und mqtt_certs .
Der Unterzeichnungsprozess der Firmware benötigt einen Unterschriftenschlüssel. Dieser Sigining -Schlüssel wird mit OpenSSL erstellt, das im Stammprojektordner secure_esp ausgeführt werden muss:
openssl ecparam -name prime256v1 -genkey -noout -out ~/esp/secure_esp/secure_boot_signing_key.pem
Installation des Mosquitto -Brokers, der auf Ubuntu Server 20.04 LTS durchgeführt wird:
sudo apt-get install mosquitto
Installation des Mosquitto -Clients:
sudo apt-get install mosquitto-clients
Nachdem der Mosquitto Broker installiert wurde, muss eine neue Datei namens secure.conf im Ordner: /etc/mosquitto/conf.d erstellt werden. Diese Datei muss die folgenden Informationen enthalten:
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
Kopieren Sie die Zertifikate ca.crt, server.crt und server.key, erstellt mit Certifical_creation.sh, in/etc/mosquitto/certs/order.
Danach muss der Broker neu gestartet werden:
sudo systemctl restart mosquitto.service
Der Broker kann getestet werden, indem ein Thema abonniert und eine Nachricht zu diesem Thema veröffentlicht wird. Die IP muss in die IP -Adress des Broker geändert werden.
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
Das Certificate_creation.sh erstellt die Ordner mqtt_certs und ota_certs. In diesen Ordnern werden die Zertifikate und Schlüssel für das Update und den MQTT -Server automatisch aus dem erstellten CA -Verzeichnis kopiert. Danach muss der IP -Angabel des MQTT -Broker im Quellcode der Datei mqtt.c konfiguriert werden:

Wir verwenden MQTTS und Port 8883 für eine sichere Verbindung über TLS.
/ESP/Update/URL - Thema veröffentlichen
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 - Thema veröffentlichen
mosquitto_pub -h $IP -t "/esp/update/use_url" -m "1" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ESP/Update/Intervall - Thema veröffentlichen
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 - Thema veröffentlichen
mosquitto_pub -h $IP -t "/esp/update/run" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ESP/Neustart - Thema veröffentlichen
mosquitto_pub -h $IP -t "/esp/restart" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ESP/Protokoll - Thema abonnieren
mosquitto_sub -h $IP -t "/esp/log" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt Die Update -Firmware -Version muss höher sein als die firmware -Version. Aus diesem Grund muss die Versionsnummer in der Datei SDKConfig unter CONFIG_APP_PROJECT_VER erhöht werden, bevor das Projekt für das OTA -Update erstellt wird. Alternativ kann dies von der idf.py menuconfig unter Application Manager erfolgen: 
Die Firmware -Upgrade -URL kann in der idf.py menuconfig unter Beispielkonfiguration oder in der SDKConfig -Datei geändert werden: CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL

Während des Erstellungsprozesses ist die Firmware digital mit der Secure_boot_signing_key.pem signiert:
idf.py build
Nach der Ausführung dieses Befehls finden Sie die Firmware -Binärin unter: ~/esp/secure_esp/build/secure_esp.bin
Wenn Sie noch nicht bereits erledigt sind, generieren Sie die Dateien update_cert.pem und update_cert.pem mit dem Skript certificate_creation.sh.
Danach müssen diese Dateien mit der Binärdatei der Firmware in einem Ordner kopiert werden. Um den Aktualisierungsserver zu starten, wird der folgende Befehl verwendet:
openssl s_server -WWW -key update_key.pem -cert update_cert.pem -port 8070
Für die Codierung einer Anwendung für dieses Projekt ist eine Beispiel -Blink -Anwendung im Code enthalten. Diese Beispielanwendung kann in der Datei secure_esp.c gefunden werden. Es wird vom Hauptprozess ausgeführt und wird in einer endlosen Schleife ausgeführt. Für das Blink -Beispiel ist eine LED am GPIO -Pin 9 definiert. Es schaltet sich nach einer Sekunde wieder aus und wird wieder eingeschaltet. In diesem Beispiel wird angezeigt, wie eine grundlegende App zu Secure_esp eingeht:

In diesem Projekt ist die Flash-Decryption aktiviert. Der anfängliche Blitz muss mit dem normalen Flash -Befehl erfolgen:
idf.py -p [port] flash monitor
Anschließend kann der ESP32 nur mit dem Befehl verschlüsselter Flash blitzt werden:
idf.py -p [port] encrypted-flash monitor
Wenn die folgende Fehlermeldung auftritt, ist es hilfreich, die Taste auf dem ESP32 beim Flashen zu drücken:
