文档说明
- 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.bin
hello_world.bin
为原始未被签名的app.bin
5 、对已经签名的 SIGNED_hello_world.bin
进行 OTA 测试
- 可基于 simple_ota_example 例程进行 OTA 测试,参见 “ESP32 HTTP OTA test” 说明。例如