ESP32-C3 Secure Boot 使用多个签名 Key
软件准备:
- 基于 esp-idf/examples/get-started/hello_world 例程进行测试
硬件准备:
- ESP32-C3-DevKit board
1. 生成多个 Secure Boot V2 签名 Key
- Secure Boot Key1
espsecure.py generate_signing_key secure_boot_signing_key.pem --version 2 --scheme rsa3072
- Secure Boot Key2
espsecure.py generate_signing_key secure_boot_signing_key2.pem --version 2 --scheme rsa3072
- Secure Boot Key3
espsecure.py generate_signing_key secure_boot_signing_key3.pem --version 2 --scheme rsa3072
2. 软件配置
- 增大
partition-table
的偏移地址
- 开启
Secure Boot
配置选项
3. 编译获取 bootloader.bin
idf.py bootloader
但我们需要使用多 Secure Boot key 对 bootloader-unsigned.bin
进行签名,使用如下指令:
espsecure.py sign_data --version 2 --keyfile secure_boot_signing_key.pem secure_boot_signing_key2.pem secure_boot_signing_key3.pem --output signed-bootloader.bin build/bootloader/bootloader-unsigned.bin
4. 下载被多 key
签名的 signed-bootloader.bin
esptool.py --chip esp32c3 -p COM62 -b 460800 --before=default_reset --after=no_reset --no-stub write_flash --flash_mode dio --flash_freq 80m --flash_size keep 0x0 signed-bootloader.bin
- 强制下载
bootloader.bin
使用如下指令:
在
write_flash
之后增加--force
esptool.py --chip esp32c3 -p COM62 -b 460800 --before=default_reset --after=no_reset --no-stub write_flash --force --flash_mode dio --flash_freq 80m --flash_size keep 0x0 signed-bootloader.bin
5. 编译获取 app.bin
和 partition-table.bin
idf.py build
6. 使用如下指令下载 app.bin
和 partition-table.bin
app.bin
只要确保有一个签名Key
是正确的即可,不需要被多 Key
进行签名,即使使用多 Key 来签名
app.bin,也不会同时验证
多个签名 Key
的摘要。
idf.py -p COM3 flash monitor
7. 查看 efuse 信息可以发现会写入 3 个 secure boot key
的摘要,并使能对应 eFuse 控制位
之后可以通过软件更改 key
的配置来更改 app.bin
签名的 key
app.bin
只要被任意一个secure boot key
进行签名,即可正常启动。
后续更新 Secure Boot Key
,也只需要重新下载 或 OTA 使用新的 Key
签名的 app.bin
esptool.py -p COM62 -b 460800 --before default_reset --after no_reset --chip esp32c3 --no-stub write_flash --flash_mode dio --flash_size keep --flash_freq 80m 0x20000 build\hello_world.bin
【注意】
- 多个签名
Key
的唯一好处就是可以撤销有风险的Key
- 如果需要撤销
Key0
、Key1
或Key2
,可以使用如下指令将对应eFuse bit
写1
espefuse.py -p COM62 burn_efuse SECURE_BOOT_KEY_REVOKE0 1
espefuse.py -p COM62 burn_efuse SECURE_BOOT_KEY_REVOKE1 1
espefuse.py -p COM62 burn_efuse SECURE_BOOT_KEY_REVOKE2 1
- 注意:一旦
Secure Boot Key
被撤销,将不可再次恢复使用。