4. 安全固件与密钥管理

在STM32MP系列处理器的安全启动与安全升级链路中,密钥是整个信任链的根。固件镜像是否可信、升级包是否被篡改、设备身份是否可验证,最终都归结为密钥的生成、保护、使用与退役是否规范。本节围绕密钥全生命周期展开,重点说明在STM32MP平台上如何把密码学操作落到工程实践中。

一、密钥生成:随机性是第一道门槛

密钥生成不是“随便生成一个文件”,而是必须保证足够的熵。STM32MP1内部集成了硬件真随机数发生器(RNG),在安全启动配置阶段,建议使用STM32CubeProgrammer配合OTP区域写入密钥哈希,而原始私钥则应在离线环境中生成。典型做法是在一台不联网的Linux主机上使用OpenSSL生成ECDSA P-256密钥对:

# 生成ECC私钥(P-256曲线)
openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem

# 导出公钥
openssl ec -in private_key.pem -pubout -out public_key.pem

# 查看密钥参数
openssl ec -in private_key.pem -text -noout

对于RSA方案,常用2048或3072位,生成命令为openssl genrsa -out rsa_private.pem 3072。需要强调的是,私钥一旦生成,必须立即进入受控存储流程,不能以明文形式留在开发机磁盘上。STM32MP1的OTP(One-Time Programmable)区域只存储公钥哈希或密钥哈希,私钥永远不应写入芯片内部可读区域。

二、签名与加密:两种操作不能混淆

签名用于验证来源和完整性,加密用于保护机密性。在安全固件升级中,通常先对固件镜像做哈希,再用私钥对哈希值签名,设备端用公钥验签。STM32MP1的ROM Code在FSBL阶段会验证头部签名,而后续镜像由TF-A和U-Boot继续验证。签名流程示例:

# 对固件镜像生成SHA-256摘要并签名
openssl dgst -sha256 -sign private_key.pem -out firmware.sig firmware.bin

# 设备端或主机端验签
openssl dgst -sha256 -verify public_key.pem -signature firmware.sig firmware.bin

加密则用于保护升级包中的敏感数据,例如使用AES-256-GCM对固件加密,密钥通过ECDH协商或预先烧录的对称密钥派生。STM32MP1的CRYP外设支持AES、DES、SHA等算法,可在安全环境中加速运算。注意:签名不提供机密性,加密不提供来源认证,二者必须配合使用。

三、PKI体系与HSM使用

在量产场景中,单把密钥无法满足多产品线、多批次、多代工厂的管理需求,因此需要引入PKI体系。典型结构是:根CA离线保存,签发中间CA,中间CA再签发设备证书或固件签名证书。STM32MP1支持X.509证书链验证,可将根CA哈希烧录到OTP中,设备启动时逐级验证。

HSM(硬件安全模块)用于保护CA私钥和签名私钥。量产签名服务器不应直接持有明文私钥,而是通过PKCS#11接口调用HSM完成签名操作。例如使用pkcs11-tool或OpenSSL的engine接口:

# 通过PKCS#11调用HSM中的私钥签名
openssl dgst -sha256 -engine pkcs11 -keyform engine \
  -sign "pkcs11:object=fw-signing-key;type=private" \
  -out firmware.sig firmware.bin

这样私钥永不离开HSM,签名操作可审计、可限权。对于STM32MP1,还可以结合TF-A的fwu(Firmware Update)框架和OP-TEE中的可信密钥存储,把密钥使用限制在安全世界内。

四、密钥存储与生命周期管理

密钥存储按安全等级可分为:OTP/熔丝区(不可逆,适合根公钥哈希)、安全世界存储(OP-TEE RPMB或TEE内部)、加密文件系统(适合开发阶段)、明文文件(仅限测试,禁止量产)。STM32MP1的BSEC(Boot and Security Control)模块提供OTP读写,写入后不可更改,因此烧录前必须校验。

生命周期管理应覆盖:生成→登记→分发→使用→备份→轮换→撤销→销毁。每个阶段都要有责任人、审批记录和审计日志。建议为每把密钥分配唯一ID,记录算法、用途、有效期、关联设备批次和HSM槽位。

STM32MP1 密钥全生命周期与信任链 生成 登记 分发 使用 轮换 撤销 密钥 生命周期 信任链与存储层级 根CA(离线HSM) 私钥永不导出 · 签发中间CA 中间CA / 签名服务器(HSM) PKCS#11调用 · 固件签名 STM32MP1 设备端 OTP存根公钥哈希 · TF-A验签 安全存储 OP-TEE RPMB · BSEC OTP · 加密FS 撤销:CRL/OCSP或OTP版本号递增;轮换:新密钥签名+旧密钥过渡

五、密钥撤销与轮换

密钥撤销通常有两种触发条件:私钥泄露或算法过期。在PKI体系中,可通过CRL(证书撤销列表)或OCSP(在线证书状态协议)通知设备。但STM32MP1设备往往离线运行,因此更实用的方式是使用OTP中的密钥版本号(Key Revision)或镜像版本号。当新固件使用新密钥签名时,版本号递增,旧版本固件被拒绝启动。

轮换策略建议采用“双密钥过渡”:设备同时信任新旧两把公钥,新固件用新私钥签名,旧固件仍可用旧密钥验证。待所有设备升级完成后,再通过OTP烧录或安全更新移除旧公钥。轮换周期建议为1~3年,或每次重大安全事件后立即执行。

注意:STM32MP1的OTP区域写入不可逆。在烧录根公钥哈希前,务必在测试设备上完整验证签名链,确认公钥哈希、算法标识和版本号无误后再执行量产烧录。

六、工程落地检查清单

环节关键动作STM32MP1对应机制
密钥生成离线主机+硬件RNG,生成ECC P-256或RSA-3072RNG外设、OpenSSL
签名对镜像SHA-256摘要签名,HSM内完成TF-A FIP、PKCS#11
加密AES-256-GCM保护升级包,密钥派生CRYP外设、OP-TEE
存储公钥哈希入OTP,私钥入HSM,禁止明文落盘BSEC OTP、RPMB
撤销版本号递增,CRL/OCSP辅助OTP版本、TF-A验证
轮换双密钥过渡,分批升级后移除旧钥多公钥槽位、安全更新

密钥管理不是一次性任务,而是贯穿产品定义、研发、量产、运维和退役的持续过程。在STM32MP1平台上,把OTP、BSEC、OP-TEE、TF-A和HSM组合成完整的密钥治理体系,才能真正让安全启动和安全升级具备可落地的信任基础。