文档说明
- Secure Boot V2
测试准备:
- 硬件准备:
ESP32-S3开发板或模组 - 软件准备:
esp-idf v5.0版本 SDK
测试步骤:
- 生成指定
secure boot 签名 key - 软件开启
secure boot 配置 - 烧录
被签名的固件 - 对新的
app.bin使用指定key进行签名 - 对已经
签名的 app.bin进行 OTA 测试
1、生成指定 secure boot 签名 key
- 可使用 esptool 工具,运行如下指令生成指定
secure boot 签名 key
espsecure.py generate_signing_key secure_boot_signing_key.pem --version 2
secure_boot_signing_key.pem为生成的(自定义名称)的key file文件--version 2为选择secure boot V2版本

2、软件开启 secure boot 配置
- 使能 secure boot 功能的软件配置
- 将 key 文件放到当前工程目录下,并使用指定 key 进行签名
- 同时,注意
UART ROM download mode配置选项的设置,若需要运行重烧固件,可按照如下进行设置
idf.py menuconfig —> Security features —> UART ROM download mode

3、 烧录被签名的固件
- 由于 Secure boot 是对二级 bootloader 进行签名,因此编译生成的
被签名的 bootloader.bin将增大,需要调整默认 partition table 偏移地址。
idf.py menuconfig —> Partition Table
- 使用
idf.py build指令编译当前工程,编译完成后会生成已经签名的 bootloader.bin 和 app.bin,以及未被签名的 bootloader-unsigned.bin 和 app-unsigned.bin,如下:


- 注意编译完成后,直接使用
idf.py flash指令烧录固件不会烧录被签名的 bootloader.bin,只会烧录partition-table.bin、ota_data_initial.bin以及被签名的 blink.bin,需要自行对被签名的 bootloader.bin进行烧录

- 烧录
被签名的 bootloader.bin固件,可在当前工程目录下,使用idf.py bootloader-flash指令来烧录被签名的 bootloader.bin固件。如下:

- 固件烧录后会在第一次启动运行时
完成 secure boot 签名,对 eFuse 写入secure boot 签名 key以及secure boot 控制位,参见如下启动日志:

-
若
未设置安全下载模式可使用espefuse.py summary指令查看eFuse信息,可以发现,Secure Boot被使能,且 eFuse 中写入了secure boot 签名 key,如下:

-
若
设置了安全下载模式可使用esptool.py --no-stub get_security_info指令查看eFuse 中的安全信息,如下:

- 对照 《ESP32-S3 技术参考手册》中的 “表 52. 密钥用途数值对应的含义” 说明,我们来看
EFUSE_KEY_PURPOSE对应的数值含义。

Key_Purposes:(9,0,0,0,0,0,12)第一个 eFsue block 为 9 ,说明这里已经有一个 secure boot 的 digest 烧录到 eFuse 了
4、对新的 app.bin 使用指定 key 进行签名
- OTA 更新时固件时,需要对新的
app.bin使用secure boot 签名 key(secure_boot_signing_key.pem)进行签名,使用hello_world.bin进行测试,使用如下指令:
espsecure.py sign_data --version 2 --keyfile secure_boot_signing_key.pem --output SIGNED_hello_world.bin hello_world.bin

secure_boot_signing_key.pem为 key 文件SIGNED_hello_world.bin为自定义名称的 被签名的后生成的 app.binhello_world.bin为原始未被签名的app.bin
5 、对已经签名的 SIGNED_hello_world.bin 进行 OTA 测试
- 可基于 simple_ota_example 例程进行 OTA 测试,参见 “ESP32 HTTP OTA test” 说明。例如






















