6.4 设备安全与 OTA 升级


6.4 设备安全与 OTA 升级

本节摘要:认证与 OTA 是量产前的两道必答题:前者回答"凭什么相信这台设备、这台设备凭什么相信服务器",后者回答"固件出厂后怎么迭代"。本节从共享密钥讲到证书认证的升级路线,再拆解双分区 OTA 与回滚保护的设计,最后用一次断电升级实验验证整条链路——这两件事做扎实,设备才有资格离开你的视线。

6.3 节让设备与云端对上了账;这一节给这套关系上保险。安全与升级放在章尾,因为它们是联网体系的"出厂门禁":门禁没过,前面所有功能都是裸奔;门禁过了,设备才算真正走上产线。

出厂之后,固件还有第二次生命

先说升级,因为它是安全的载体。第一台联网设备烧好固件出厂的那天起,你就开始欠债:Bug 会发现、协议要演进、漏洞要修补——没有 OTA 的联网设备,每个 Bug 都是永久刑期。OTA 不是锦上添花,是联网设备的生存权。

双分区(A/B)是微控制器 OTA 的标准形态:Flash 里并存两个固件槽,运行 A 槽时下载新固件进 B 槽,下载校验通过后改写启动指针、重启切到 B。它的精妙在于升级过程本身是可回滚的——B 槽启动失败,引导程序回退到 A 槽,设备不会变砖。代价是 Flash 空间翻倍:这是"能升级"与"够用"之间最常见的一笔交换,选型时(第 1 章)就该把双倍 Flash 的余量留出来。

认证:从暗号到身份证

设备认证的入门方案是共享密钥:设备与云端预置同一个密钥,连接时以密钥计算签名证明身份。实现简单、内存友好,但有致命软肋——密钥一旦泄露,伪造设备与真设备无法区分,而量产设备的密钥分布面越广,泄露面越大。

升级路线是证书认证:每台设备烧录唯一私钥与证书,云端只信证书链。私钥不出设备、逐台唯一,单台泄露不波及他人。代价是 MCU 上的 TLS 握手更重(1 至 4 秒、几十 KB 内存),以及产线要多一道"逐台烧录证书"的工序。工程上的务实路径是分阶段走:小批量试用共享密钥,量产前切证书——但要提前确认所选芯片支持安全存储(很多新平台有硬件密钥区),免得切换时发现硬件不支持。

图:双分区 OTA 与回滚保护

图:双分区 OTA 与回滚保护

自证健康:回滚的扳机

双分区架构的成败在"自证健康"这一步。新固件启动后如果根本跑不起来(驱动不兼容、内存不够),谁来发现?答案在引导程序与新固件的约定:新固件必须在规定时间内主动写下"我健康"的确认标记;超时未写,引导程序下次启动直接回退 A 槽。健康判据要按业务定,最起码包含:主循环跑通若干轮、关键外设(传感器、通信模块)应答正常。只写"程序没崩"是不够的——程序活着但读不到传感器,对用户同样是砖。

升级的下载环节同样有纪律:断点续传与整体校验(哈希比对)是标配,下载与业务共用网络时给下载限速,避免把遥测饿死——这些细节在产线压力下都会被放大检验。

案例:断电升级实验的全记录

背景:一款智能插座准备量产,OTA 链路开发完毕,老板问了一个让工程师沉默的问题:"升级到一半家里跳闸了怎么办?"

操作:设计三组破坏性实验。实验一,下载中断电:重启后设备从 A 槽正常启动,B 槽的半截固件因校验不过被清空,重试升级——符合预期。实验二,切换后立即断电(模拟刚写入启动指针就掉电):验证引导程序对"待验证"状态的处理——重启后 B 槽没有确认标记,自动回退 A 槽。实验三,最狠的一组:新固件启动后、写确认标记前的窗口内断电,重复一百次。前两轮发现第三组的窗口处理有缺陷:确认标记的写入不是原子操作,恰好在写入中途断电会留下半新不旧的标记,引导程序误判为"已确认",而新固件实际没跑完自检——设备进入"看似启动实则瘸腿"的状态。修复:确认标记改为带魔术字与校验和的双写结构,引导程序只在标记完整合法时才信任它。

结果:第三组实验连跑一百次断电,回退行为全部正确。

解读:这组实验的哲学适用于一切"不可中断操作"的设计:断电不是异常,是必须支持的操作之一。Flash 写入的非原子性、掉电瞬间的半成品数据,都是量产设备必然遭遇的现实——标记、校验和、双写,这三件套是跟物理世界和解的最低配置。实验室里百次断电的功夫,换来的是现场万分之一的从容。

变式:固件体积小到单分区也放得下两份时(比如 32KB 级的 AVR 级应用),可以不做双分区而做"差分包加备份"——但对多数联网 MCU 项目,双分区是复杂度与可靠性的最佳平衡点,别为了省 Flash 引入更精巧的方案。

⚠️ 常见坑:升级期间的看门狗策略不调整,下载大固件耗时超时被看门狗反复打断——升级流程要进入"喂狗豁免"状态,但豁免范围要精确到下载任务,别把整个看门狗关了。

💡 关键直觉:OTA 设计的目标不是"升级成功",而是"任何一步失败都还回得去"。前者是功能,后者是底线;底线立住了,功能才有资格谈成功率。

升级窗口与灰度发布

OTA 的工程收尾还有两件事:升级窗口与灰度策略。升级窗口指允许升级的时间段——选业务空闲时段(如凌晨三点到五点),避开用户依赖设备的时段;设备侧收到升级指令先判断当前是否在窗口内,不在则只缓存指令、到点再执行。灰度发布指新固件不一次推全网:先推给内部设备(百分比一个点),观察诊断指标一天;再推百分之一、百分之十,每级停留观察。灰度的价值在 6.4 的回滚机制之上:回滚是单机的保险,灰度是全局的保险丝——一个坏版本最多伤及灰度批次。

设备侧配合灰度要做一件事:上报固件版本与升级时间戳,云端才能按版本分组看指标、按批次喊停。这两件小事与双分区、自证健康一起,构成升级体系的完整四件套——前三件保证单机升不死,灰度保证全网不被一台升级失败的设备连坐。

本节要点回顾

  • OTA 是联网设备的生存权:没有它,每个 Bug 都是永久刑期;
  • 双分区是标准形态:下载进备用槽、校验后切换、失败回退,Flash 空间翻倍是入场费;
  • 认证分两级:共享密钥易部署难防泄露,证书逐台唯一且私钥不出设备;
  • 自证健康触发回滚:判据要覆盖业务功能,不是"程序没崩";
  • 断电是必须支持的操作:标记加校验和加双写,是半成品数据的唯一解药。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U