3. 安全启动与信任根建立
安全启动的本质,是让芯片在上电后沿着一条“只能按既定顺序、只能执行被授权代码”的路径走到应用。要让这条路径可信,起点必须不可篡改——这就是不可变信任根(Immutable Root of Trust,iRoT)。在 MCX 系列(如 MCX N947、MCX A 系列)中,iRoT 由出厂固化在 ROM 中的引导代码与芯片内一次性可编程(OTP)区域中的信任根参数共同构成。ROM 代码不可改写,OTP 中的哈希、公钥摘要与启动配置一旦烧写也无法回退,二者一起把“第一段被执行的代码”钉死在可信状态。
不可变信任根由什么构成
MCX 的信任根不是单一对象,而是三层绑定关系:ROM 引导代码负责最初始的镜像头解析与签名校验;OTP(fuse)中保存根公钥的 SHA-256 摘要、启动模式位(如是否强制安全启动、是否允许串行下载恢复)以及生命周期状态;SRAM/Flash 中的镜像头则携带签名、证书链和镜像度量值。ROM 用 OTP 中的摘要去验证镜像头里的根公钥证书,再用该公钥验证镜像签名,形成“ROM→根公钥→镜像”的信任传递。任何一环被替换,校验都会在早期失败。
安全启动流程与镜像签名验证
以 MCX N947 的典型安全启动为例,上电复位后流程如下:ROM 读取启动配置(BOOT_CFG)确定启动介质与安全启动使能位;从介质加载镜像头(Image Header),解析其中的证书链、镜像长度、目标地址与签名算法;用 OTP 中的根公钥摘要验证证书链顶端;用证书链中的镜像签名公钥验证镜像体签名;校验通过后把控制权交给镜像入口。若任一步失败,ROM 不会执行该镜像,而是进入失败处理路径。
镜像签名通常采用 ECDSA P-256 或 RSA-2048/3072,签名对象是镜像体的哈希(SHA-256)。签名验证不是“比对哈希”,而是用公钥对签名做数学验证,确认签名确实由对应私钥对当前镜像体生成。因此镜像体任何一字节变化都会导致验证失败。下面是一段用于生成待签名镜像摘要并做本地校验的示例命令,参数为教学示例,实际值需按工程替换:
# 1) 计算镜像体 SHA-256(示例镜像 app.bin)
sha256sum app.bin
# 输出示例:3f2a...c91d app.bin
# 2) 用私钥对摘要签名,生成 app.sig(ECDSA P-256)
openssl dgst -sha256 -sign root_priv.pem -out app.sig app.bin
# 3) 用公钥验证签名(本地自检)
openssl dgst -sha256 -verify root_pub.pem -signature app.sig app.bin
# 期望输出:Verified OK
把 app.bin、app.sig 与镜像头一起打包成 MCX 可识别的启动镜像(如使用 SPSDK 的 nxpimage 工具生成 .sb 或 .bin 镜像),再通过调试器或串行下载写入启动介质。上电后若串口输出停留在 ROM 阶段、无应用打印,通常说明签名或证书链校验未通过。
启动失败恢复策略
安全启动必须预设“失败后怎么办”,否则一次误烧写就可能让设备变砖。MCX 常见恢复手段有三类:其一是串行下载恢复(Serial Download / ISP),当 OTP 中允许恢复且启动介质镜像校验失败时,ROM 可进入串行下载模式,通过 UART/USB 重新写入合法镜像;其二是双镜像/备份槽(A/B 槽)回滚,主槽校验失败时跳转到备份槽;其三是生命周期状态切换,在开发阶段保持开放状态便于调试,量产阶段关闭调试接口并锁定启动配置。
MCX 实机配置要点
在 MCX 上落地安全启动,通常借助 NXP SPSDK 与 MCUXpresso 工具链完成。关键动作包括:生成根密钥对并妥善离线保存私钥;用 nxpkeygen 或 OpenSSL 生成证书链;用 nxpimage 对镜像签名并打包;通过 blhost 或调试器烧写 OTP 中的根公钥摘要与启动配置;最后复位验证。下面给出一个可参考的配置检查清单,字段均对应 MCX 安全启动的真实配置项:
| 配置项 | 示例值/状态 | 作用 |
|---|---|---|
| 安全启动使能位 | Enabled | 强制 ROM 执行签名校验 |
| 根公钥摘要(OTP) | SHA-256,64 hex | 锚定信任根公钥 |
| 签名算法 | ECDSA P-256 / SHA-256 | 镜像签名与验证 |
| 启动介质 | FlexSPI NOR / SD | 镜像加载来源 |
| 串行下载恢复 | Allowed(开发)/ Disabled(量产) | 失败后能否重写镜像 |
| 备份槽 | Slot B 已配置 | 主槽失败时回滚 |
| 生命周期 | Open → Locked | 控制调试与烧写权限 |
验证时建议分三步观察:先用合法签名镜像启动,确认应用正常打印;再故意修改镜像中一个字节重新打包,确认 ROM 拒绝启动并进入恢复路径;最后用备份槽或串行下载写入合法镜像,确认设备可恢复。只有这三步都符合预期,安全启动链路才算真正建立。
把上述链路串起来看:OTP 中的根公钥摘要锚定信任根,ROM 用它对镜像头证书链做校验,证书链中的公钥再验证镜像体签名,通过则执行、失败则进入恢复。只要 OTP 与 ROM 不可变,整条信任链就无法被外部替换。实机配置时,先确认签名与打包正确,再烧写 OTP,最后用“合法启动、篡改拒绝、恢复成功”三步验证闭环,安全启动才算真正落地。