安全启动与固件签名
使用技术: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 |
量产建议开启 |