简介
Secure Boot,即安全启动,是一种确保在一个平台上运行的程序的完整性的过程或机制。它的主要作用是在固件和应用程序之间建立一种信任关系,从而保护操作系统免受恶意攻击。
工作原理
签名验证:Secure Boot使用公钥/私钥对来验证固件和应用程序的签名是否合法。在设备启动时,Secure Boot会检查固件的签名,如果签名验证失败,则固件将无法加载。
信任链建立:Secure Boot通过建立一个从启动加载程序(如BIOS或UEFI)到操作系统内核的信任链来确保整个启动过程的安全性。每个阶段的固件都必须通过签名验证才能进入下一个阶段。
esp32 配置 secure boot
idf.py menuconfig
打开secure boot
相关配置
💥 测试阶段建议
UART ROM download mode (UART ROM download mode (Enabled (not recommended)))
设置为UART ROM download mode
防止造成不可逆的后果。
- 准备签名文件
espsecure.py generate_signing_key --version 2 --scheme rsa3072 secure_boot_signing_key.pem
生成密钥文件
idf.py build 编译
查看编译结果会生成加密和未加密的固件- 将编译产生的
bootloader 、partition_table、 app image
烧录进设备中即可。
执行过程
- 编译 bootloader image 时发现 menuconfig 中使能了 secure boot,于是根据 menuconfig 中指定的公钥/秘钥文件路径将公钥编译到 bootloader image 中,bootloader 被编译成支持 secure boot
- 编译 partition table 和 app images 时使用秘钥计算出签名,将签名编译到相应的二进制文件中
- 芯片第一次 boot 时,软件 bootloader 根据以下步骤使能 secure boot:
硬件产生一个 secure boot key,将这个 key 保存在 efuse 中,利用这个 key、一个随机数 IV 和 bootloader image 计算出 secure digest,secure digest 与随机数 IV 保存在 flash 的 0x0 地址,用于在后续 boot 时验证 bootloader image 是否被篡改,若 menuconfig 中选择了禁止 JTAG 中断和 ROM BASIC 中断,bootloader 会将 efuse 中的一些标志位设置为禁止这些中断(强烈建议禁止这些中断)bootloader 通过烧写 efuse 中的 ABS_DONE_0 永久使能 secure boot。 - 芯片在后面的 boot 中,ROM bootloader 发现 efuse 中的 ABS_DONE_0 被烧写,于是从 flash 的地址 0x0 读取第一次 boot 时保存的 secure digest 和随机数 IV,硬件使用 efuse 中的 secure boot key 、随机数 IV 与当前的 bootloader image 计算当前的 secure digest,若与 flash 中的 secure digest 不同,则 boot 不会继续,否则就执行软件 bootloader。
- 软件 bootloader 使用 bootloader image 中保存的公钥对 flash 中的 partition table 和 app images 签字进行验证,验证成功之后才会 boot 到 app 代码中。