跳转至

安全启动与固件签名

使用技术:Secure Boot、固件签名校验

前置阅读:OTA 固件升级

学习目标

  • 理解安全启动的原理——芯片上电 → BootROM 校验 Bootloader 签名 → Bootloader 校验 App 固件签名 → 签名不合法拒绝启动
  • 理解固件签名和验签流程——RSA/ECDSA 签名,公钥烧录在 eFuse 中
  • 理解安全启动与 OTA 的关系——OTA 下载的固件必须带合法签名才能通过校验

基本概念

信任链模型

每一级由前一级校验签名——任何一级校验失败则启动中断。

flowchart TD
    ROM[BootROM<br/>硬件信任根] -->|校验签名| BL[Bootloader<br/>校验后信任]
    BL -->|校验签名| APP[App 固件<br/>校验后信任]
    BL -->|校验失败| FAIL1[拒绝启动]
    ROM -->|校验失败| FAIL2[拒绝启动]

密钥体系

密钥 存储位置 用途
根私钥 构建服务器(离线保管) 对固件签名
根公钥 eFuse(一次性烧录) 验证固件签名

私钥永不离开构建服务器。公钥烧录 eFuse 后不可更改——即使攻击者获得芯片也无法替换公钥。

签名流程

编译固件 → SHA256 hash → 私钥签名 → 签名附加到固件尾部(.upg 格式)→ OTA 推送 → 芯片用 eFuse 公钥验签。

防回滚

固件版本号单调递增——旧版本固件即使有合法签名也拒绝执行。Kconfig 中启用 CONFIG_SECURE_BOOT_ANTI_ROLLBACK

涉及概念

安全启动为芯片级特性,无应用层 API——由 BootROM/Bootloader 自动完成。应用层关注点:
- OTA 固件包必须包含合法签名
- eFuse 公钥烧录为一次性操作(通过产测工具)

案例说明

安全启动为系统级安全特性——应用层代码不需要调用任何 API,但需要理解:
- 开发调试阶段通常关闭安全启动(方便反复烧录测试固件)
- 量产阶段开启安全启动 + 烧录公钥(确保只有合法固件运行)
- OTA 固件包必须经过签名才能被安全启动接受

关键配置

参数 推荐值 说明
签名算法 RSA-2048 / ECDSA-P256 ECDSA 密钥更短、速度更快
eFuse 公钥 hash 32B(SHA256) 不存完整公钥,存 hash 节省 eFuse 空间
防回滚 CONFIG_SECURE_BOOT_ANTI_ROLLBACK=y 量产建议开启