Secure設計的ESP32框架具有更新的空氣(OTA),Flash加密,簽名的FirmeWare驗證,MQTT和非揮發存儲。它可用於所有考慮安全基礎的物聯網開發項目。對於此項目,使用了ESP-Wroom-32。
ESP-IDF安裝Windows Linux和Mac的安裝完整說明可在Espressif安裝逐步指南中提供。在這個項目中,遵循了Ubuntu和Debian的Linux路徑:
先決條件:
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
下載並安裝:
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh
使用ESP-IDF(每次啟動新外殼時都需要執行):
. ~/esp/esp-idf/export.sh
為項目創建一個文件夾,然後從Git下載ESP32框架:
cd ~/esp
git clone https://github.com/flouflouit/secure_esp
該項目所需的命令的簡短列表。所有這些都必須在根項目文件夾secure_esp中執行。
WiFi的SSID和密碼在idf.py menuconfig中配置在Example Connection Configuration下或直接在SDKConfig中:
CONFIG_EXAMPLE_WIFI_SSID=""
CONFIG_EXAMPLE_WIFI_PASSWORD=""

對於更新服務器和MQTT代理證書,需要創建。因此,實現了centerive_creation.sh bash腳本。如果此腳本是在MQTT代理上執行的,則可以將MQTT證書直接複製到Mosquitto文件夾中。 IP變量必須包含更新服務器和MQTT代理的IP ADRESS,該代理需要在腳本中進行編輯。
. ~/esp/secure_esp/certificate_creation.sh
該腳本生成以下樹結構:

此外,腳本還將密鑰和證書複製到ota_certs和mqtt_certs項目文件夾。
固件的簽名過程需要一個簽名密鑰。使用OpenSSL secure_esp此sigining鍵
openssl ecparam -name prime256v1 -genkey -noout -out ~/esp/secure_esp/secure_boot_signing_key.pem
在Ubuntu Server上完成的蚊子經紀人的安裝20.04 LTS:
sudo apt-get install mosquitto
蚊子客戶的安裝:
sudo apt-get install mosquitto-clients
安裝了蚊子經紀人後,必須在文件夾中創建一個名為secure.conf的新文件:/etc/mosquitto/conf.d。此文件必須包含以下信息:
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
將證書CA.CRT,SERVER.CRT和SERVE.KEY複製,使用CERTICY_CREATION.SH創建的證書,/etc/Mosquitto/certs/文件夾。
之後,經紀人需要重新啟動:
sudo systemctl restart mosquitto.service
可以通過訂閱主題並向該主題發布消息來測試經紀人。 IP必須更改為經紀人的IP Adress。
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
centerry_creation.sh創建文件夾mqtt_certs和ota_certs。在這些文件夾中,更新和MQTT服務器的證書和鍵將自動從創建的CA目錄複製。之後,必須在文件mqtt.c的源代碼中配置MQTT代理的IP adress:

我們使用MQTT和端口8883進行TLS的安全連接。
/esp/update/url-發布主題
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-發布主題
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/INTERTAL-發布主題
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-發布主題
mosquitto_pub -h $IP -t "/esp/update/run" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ESP/RESTART-發布主題
mosquitto_pub -h $IP -t "/esp/restart" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/esp/log-訂閱主題
mosquitto_sub -h $IP -t "/esp/log" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt 更新固件版本必須高於運行固件版本。這就是為什麼在構建OTA更新項目之前,需要在CONFIG_APP_PROJECT_VER下的文件sdkconfig中增加版本編號的原因。另外,它可以由idf.py menuconfig在應用程序經理下完成: 
固件升級URL可以在idf.py menuconfig中更改示例configuration或dircetly在sdkconfig文件中: CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL

在構建過程期間
idf.py build
執行此命令後~/esp/secure_esp/build/secure_esp.bin可以在以下位置找到固件二進製文件:
如果尚未完成,請使用CERTICT_CREATION.SH腳本生成文件update_cert.pem和update_cert.pem。
之後,這些文件必須在一個文件夾中使用固件的二進制複製。要啟動更新服務器,使用了以下命令:
openssl s_server -WWW -key update_key.pem -cert update_cert.pem -port 8070
對於為該項目編碼的應用程序,代碼中包含示例眨眼應用程序。可以找到此示例應用程序的文件secure_esp.c 。它將由主過程執行,並在無盡的循環中運行。對於眨眼示例,在GPIO引腳9上定義了LED。一秒鐘後它再次關閉。此示例顯示瞭如何將基本應用程序包含到secure_esp:

在此項目中,啟用了閃存加密。必須使用普通閃存命令完成初始閃光燈:
idf.py -p [port] flash monitor
之後,ESP32只能使用加密閃光命令來閃爍:
idf.py -p [port] encrypted-flash monitor
如果發生以下錯誤消息發生,則可以在閃爍時按ESP32上的啟動按鈕:
