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上的启动按钮:
