ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Jetson eFuse 量产烧录实战:Secure Boot 密钥配置与避坑指南

Jetson eFuse 量产烧录实战:Secure Boot 密钥配置与避坑指南 1. 为什么要在量产阶段动 eFuse 这根“保险丝”很多做 Jetson 边缘设备的团队在研发阶段用 SDK Manager 刷个机、跑通 demo 就以为万事大吉了直到产线小批量试产时才被现实教育设备到了客户手里固件被人整个读出来、克隆板子满天飞或者因为安全启动没开攻击者直接替换了 rootfs 里的关键二进制。这时候才回头补安全成本已经翻了好几倍。Jetson 平台上的eFuse就是解决这类问题的硬件级手段。它本质上是一组一次性可编程OTP的存储位烧进去就改不回来所以业界管它叫“电子保险丝”。在 Jetson 上eFuse 承担了几件关键的事写入设备唯一的密钥材料、开启Secure Boot安全启动、配置SecurityMode、以及绑定FSKPFuse Secure Key Programming熔丝安全密钥编程相关的密钥槽。一旦烧录完成芯片只会用你烧进去的公钥去校验引导链任何未经签名的固件都别想启动。但“一次性”这三个字意味着风险极高。我见过不止一个团队在没搞清楚 PKCPublic Key Cryptography和 SBKSecure Boot Key区别的情况下就贸然烧录结果板子直接变砖只能返厂换模组。所以这篇内容不是教你“点一下按钮”而是把量产预置安全这件事拆开讲透eFuse 到底烧了什么、为什么这么烧、烧之前必须准备什么、烧的过程中哪些参数会要命、烧完之后怎么验证。适合读这篇的人有三类一是正在把 Jetson 产品从样机推向量产的嵌入式工程师二是负责产线预置流程、需要写烧录 SOP 的测试工程师三是做边缘 AI 设备、对固件防克隆有实际需求的技术负责人。如果你只是想在开发板上跑个 YOLOv5 或者部署个 Qwen那这篇内容对你来说偏重了可以先收藏等产品要量产时再翻出来。需要先明确一个前提不同 Jetson 模组Nano、Orin NX、Orin Nano、AGX Orin的 eFuse 布局和烧录工具链有差异但核心逻辑是一致的。下面我以 Orin 系列为主线索穿插 Nano 的差异点把整套流程讲清楚。2. eFuse 里到底存了什么PKC、SBK 与 SecurityMode 的分工2.1 PKC 与 SBK一个管“验签”一个管“解密”很多人第一次接触 Jetson 安全烧录时会被 PKC、SBK、FSKP 这几个缩写绕晕。我用一个生活化的类比帮你理清把设备启动想象成进一栋大楼。PKC相当于大楼门口保安手里的“授权名单”它是一对非对称密钥里的公钥部分烧进 eFuse 后芯片用它来验证每一级固件的签名。你签名用的私钥留在自己的服务器上绝不外泄。保安只认名单上的签名别人伪造的签名一律拦下。SBK则是另一回事它是对称密钥作用是“加密”。在 Secure Boot 流程里引导链上的固件可以被 SBK 加密存储芯片启动时用 eFuse 里的同一把 SBK 解密。这样即使有人把 Flash 里的固件 dump 出来拿到的也是密文。PKC 管的是“是不是你签的”SBK 管的是“内容看不看得懂”两者职责完全不同。这里有个常见的误区有人以为烧了 PKC 就万事大吉结果固件还是明文躺在存储里被人直接读走逆向。所以如果你的威胁模型里包含“防固件提取”PKC 和 SBK 要一起上如果只是防“未授权固件启动”PKC 单独烧也能满足。2.2 SecurityMode决定芯片“认不认”安全策略的总开关SecurityMode是 eFuse 里的一组配置位它决定了芯片启动时是否强制走安全校验路径。你可以把它理解成大楼的“门禁模式”关闭时谁都能进开启后没有授权名单PKC的人一律进不来。在 Jetson 上SecurityMode 的烧录通常和 PKC 绑定在一起。一旦开启芯片就只接受用对应私钥签名的固件。这里要特别注意SecurityMode 一旦烧录不可逆。我见过有团队在调试阶段为了图省事先把 SecurityMode 烧了结果后面想换密钥、想改启动配置发现完全动不了只能换模组。所以我的建议是调试阶段绝对不要碰 eFuse所有安全相关的烧录都放到量产预置环节且必须经过至少一轮完整的 dry-run 验证。2.3 FSKP密钥槽的“分配器”FSKP在 Jetson 安全体系里负责密钥槽的编程管理。eFuse 空间有限不同的密钥材料PKC、SBK、以及可能的其他密钥要放到指定的槽位里。FSKP 相关的配置决定了这些密钥怎么写入、写到哪个位置。在 Orin 系列上NVIDIA 提供了fskp相关的工具和配置模板用来生成密钥编程的 blob。实际操作用你不需要手动去算每个 bit 的位置工具链会帮你处理。但你必须理解FSKP 配置一旦和实际密钥不匹配烧录后芯片就找不到正确的密钥启动直接失败。所以密钥生成、FSKP 配置、烧录这三个环节必须用同一套参数中间任何一步换了密钥文件整批都要重来。项目作用是否可逆典型烧录阶段PKC固件签名验签公钥不可逆量产预置SBK固件加解密对称密钥不可逆量产预置SecurityMode强制安全启动开关不可逆量产预置FSKP密钥槽编程配置不可逆量产预置提示研发调试阶段请使用未烧录 eFuse 的模组所有安全烧录操作只在量产工装和量产模组上进行。一旦烧录模组无法恢复为“空白”状态。3. 烧录前的准备工作密钥、工具链与工装环境3.1 密钥生成别在开发机上随手 openssl 一下就完事密钥是整个安全体系的根生成环节的规范性直接决定后续能不能量产。Jetson 官方推荐用openssl生成 RSA 密钥对但有几个细节必须注意。第一密钥长度。PKC 通常用 RSA-2048 或 RSA-3072SBK 是 128 位对称密钥。别为了“更安全”上 RSA-4096部分 Jetson 模组的 BootROM 对密钥长度有硬性限制烧进去不认板子直接起不来。第二密钥的存储。私钥绝对不能放在产线工装机器上更不能进 Git 仓库。我的做法是私钥生成在一台离线的、有访问审计的签名服务器上产线只拿到公钥和已经签好名的固件。SBK 因为是对称密钥产线烧录时需要用到所以要放在受控的密钥管理系统里通过安全通道下发到工装用完即焚。第三密钥的备份。eFuse 烧录不可逆但你的私钥如果丢了后续就没法给新固件签名等于整条产品线的固件都无法升级。所以私钥必须有离线冷备份且备份介质的访问要有双人复核。生成 PKC 的典型命令如下# 生成 RSA 2048 私钥 openssl genrsa -out pkc_private.pem 2048 # 导出公钥 openssl rsa -in pkc_private.pem -pubout -out pkc_public.pem # 查看公钥信息确认长度 openssl rsa -in pkc_private.pem -text -nooutSBK 的生成可以用openssl rand# 生成 16 字节128 位SBK openssl rand -hex 16 sbk.key生成后务必核对字节数SBK 必须是 16 字节多一个少一个都会导致烧录失败。3.2 工具链版本jflash、SDK Manager 与 fskp 工具的配合Jetson 的安全烧录工具链这几年变化不小。早期 Nano 时代主要靠flash.sh加一堆参数Orin 时代 NVIDIA 推了更规范的流程涉及fskp工具、odmfuse配置等。热词里出现的jflash烧录程序、jestonsdkmanager烧录纯净系统其实反映了大家在工具选择上的混乱。我的建议是安全烧录不要用 SDK Manager 的图形界面。SDK Manager 适合刷纯净系统、做研发调试但它对 eFuse 烧录的支持是封装过的出错了你根本不知道哪一步挂了。量产预置要用命令行工具链把每一步的日志都留下来。Orin 系列上核心工具是odmfuse.sh或对应的 Python 工具配合fskp配置。你需要准备BSP 包对应 JetPack 版本的 Linux_for_Tegra 目录fskp 配置模板NVIDIA 在 BSP 里提供了fskp相关的 xml 模板签名后的固件用私钥签过名的 bootloader、kernel、rootfs 等工装环境支持 USB 恢复模式的载板以及稳定的供电这里有个容易忽略的点BSP 版本必须和模组的 BootROM 版本匹配。我遇到过用 JetPack 5.x 的 BSP 去烧 JetPack 6.x 模组fuse 配置对不上烧录工具直接报错。所以量产前一定要确认模组出厂时的固件版本拉对应的 BSP。3.3 工装与供电别让一次掉电毁掉一批模组eFuse 烧录过程中如果掉电后果可能是灾难性的部分 fuse 位烧进去了部分没烧芯片处于一个“半安全”状态既不能正常启动也没法重新烧录。所以工装环境必须满足几个条件。供电要稳。Jetson Orin 系列在恢复模式下的电流波动不小工装电源要能提供足够余量最好带 UPS 或者至少是大容量电容缓冲。USB 线要用带屏蔽的优质线劣质线在烧录大固件时容易断连。工装要有防呆。产线操作员不应该有机会把模组插反、把恢复模式按键按错。我的做法是做一个专用的烧录夹具模组放进去就自动接通恢复模式引脚操作员只需要放料、按开始、取料三个动作。还要有烧录记录。每一片模组的序列号、烧录时间、使用的密钥版本、烧录结果都要记录到数据库。eFuse 烧录不可逆出了问题要能追溯到是哪一批密钥、哪一个工装、哪一个操作员。4. 烧录流程拆解从恢复模式到 fuse 写入的完整链路4.1 进入恢复模式与设备识别Jetson 模组进入恢复模式Recovery Mode是烧录的前提。不同载板进入方式不同常见的是按住 Recovery 按键再上电或者短接特定引脚。进入后通过 USB 连接到工装主机用lsusb应该能看到 NVIDIA 的设备lsusb | grep -i nvidia # 正常输出类似Bus 001 Device 005: ID 0955:7023 NVIDIA Corp. APX如果看不到设备先排查 USB 线、驱动、以及模组是否真的进了恢复模式。Orin 系列有时候需要先断电、按住 Recovery、再上电顺序错了就进不去。设备识别后用 BSP 里的flash.sh或者odmfuse工具做一次“探测”确认工具链能正常和模组通信cd Linux_for_Tegra sudo ./flash.sh --no-flash --no-systemimg jetson-orin-nx-devkit mmcblk0p1这一步不实际烧录只是生成配置和检查通信。如果这一步就报错后面的 fuse 烧录想都别想。4.2 生成 fuse 配置odmfuse 与 fskp 的配合fuse 配置的核心是告诉工具要烧哪些位、烧什么值。Orin 系列上这个配置通常通过一个 XML 文件描述里面包含 PKC 公钥的哈希、SBK 的哈希、SecurityMode 的配置等。NVIDIA 在 BSP 里提供了模板路径一般在Linux_for_Tegra/bootloader/下文件名类似fuse_config.xml。你需要根据实际密钥修改模板里的字段。关键字段包括PkcHashPKC 公钥的 SHA-256 哈希SbkHashSBK 的哈希SecurityMode通常设为1表示开启OdmId可选用于标识产品线生成 fuse blob 的命令大致如下sudo ./odmfuse.sh -j -i 0x23 -c PKC -p pkc_public.pem -s sbk.key jetson-orin-nx-devkit这里的-c PKC表示烧录 PKC 相关 fuse-p指定公钥-s指定 SBK。实际参数要根据你的模组型号和 BSP 版本调整不同版本的odmfuse.sh参数名可能有差异务必用--help确认。生成过程中工具会输出一个 fuse blob 文件这个文件就是最终要写入 eFuse 的数据。在真正烧录前一定要用--no-flash或者 dry-run 模式跑一遍确认生成的 blob 内容符合预期。4.3 实际烧录一次不可逆的写入确认 fuse blob 无误后执行实际烧录sudo ./odmfuse.sh -j -i 0x23 -c PKC -p pkc_public.pem -s sbk.key --flash jetson-orin-nx-devkit烧录过程中工具会先进入恢复模式然后逐位写入 eFuse。这个过程通常几十秒到几分钟取决于 fuse 数量和固件大小。烧录期间绝对不能断电、不能拔 USB、不能中断进程。烧录完成后工具会输出成功信息。此时模组会自动重启如果一切正常它会用新的安全策略启动。如果启动失败说明 fuse 配置有问题这时候模组可能已经变砖只能返厂。我强烈建议第一批量产模组先烧 1-2 片做验证确认能正常启动、能正常刷入签名固件、能正常跑业务程序再批量烧。不要一上来就烧一整批万一配置错了损失惨重。4.4 烧录后的验证确认安全策略真正生效烧录完成不代表结束必须验证安全策略真的生效了。验证方法有几个层次。第一确认模组能正常启动。烧录后模组应该能进入系统如果卡在 bootloader 阶段说明 PKC 或 SecurityMode 配置有问题。第二尝试刷入未签名固件。用flash.sh刷一个没有签名的固件如果安全策略生效刷入应该失败模组拒绝启动。这一步是验证“防未授权固件”是否真的起作用。第三检查 eFuse 状态。Jetson 提供了一些工具可以读取 eFuse 的烧录状态注意只能读状态不能读密钥内容。在系统里可以通过tegra-fuse相关命令查看# 查看 fuse 状态具体命令随 BSP 版本变化 sudo cat /sys/devices/platform/tegra-fuse/ecidECID 是芯片唯一标识可以用来确认模组身份。密钥内容本身是读不出来的这是 eFuse 的设计初衷。5. 踩过的坑那些让模组变砖的瞬间5.1 密钥文件换了但 fuse 配置没更新这是最典型的事故。团队在调试阶段生成了一套密钥后来觉得不安全重新生成了一套但 fuse 配置 XML 里用的还是旧公钥的哈希。烧录后芯片用旧哈希去校验新固件当然校验失败模组直接起不来。根因在于fuse 配置和密钥是绑定的换密钥必须重新生成 fuse blob。我的做法是给密钥和 fuse 配置打上版本号每次换密钥都走一次完整的 dry-run确认生成的 blob 哈希和预期一致。5.2 SBK 长度不对导致烧录中断SBK 必须是 16 字节。有次同事用openssl rand -hex 16生成但复制的时候多带了一个换行符实际写入的是 17 字节。烧录工具在写入 SBK 槽位时报错但此时 PKC 已经烧进去了模组处于半烧录状态既不能用旧固件启动也不能重新烧录。这个坑的教训是所有密钥文件在烧录前都要用脚本校验长度和格式。我后来写了一个检查脚本在烧录前自动核对 PKC 长度、SBK 长度、文件是否存在、哈希是否匹配任何一项不过就拒绝开始烧录。5.3 工装 USB 断连导致 fuse 写入不完整产线工装用的 USB 线质量参差不齐有次烧录到一半USB 突然断连工具报错退出。检查发现部分 fuse 位已经写入但 SecurityMode 没烧完模组处于一个尴尬状态PKC 有了但安全启动没开芯片行为不确定。这种问题的预防手段是工装必须用带屏蔽和磁环的优质 USB 线且烧录过程中工装主机不能跑其他高负载任务。另外烧录脚本要加超时和重试逻辑但重试仅限于“还没开始写 fuse”的阶段一旦开始写 fuse任何中断都只能报废。5.4 不同模组型号混用同一套 fuse 配置Orin NX 和 Orin Nano 的 eFuse 布局不完全一样有团队为了省事用同一套 fuse 配置去烧两种模组结果 Nano 烧完起不来。根因是 fuse 槽位偏移不同PKC 写到了错误的位置。正确做法是每种模组型号维护独立的 fuse 配置和烧录脚本工装上要有型号识别机制放错模组直接报警。坑点现象根因预防措施密钥换了配置没换烧录后无法启动fuse blob 与密钥不匹配密钥版本化管理烧前 dry-runSBK 长度错误烧录中断半烧录状态文件含多余字符烧前脚本校验长度USB 断连fuse 写入不完整线材质量差用优质线工装主机专机专用模组型号混用部分模组无法启动fuse 槽位偏移不同按型号维护独立配置6. 量产预置的工程化建议把一次性操作变成可控流程6.1 密钥生命周期管理从生成到销毁的闭环eFuse 烧录只是密钥生命周期里的一个环节。完整的闭环包括密钥生成、密钥分发、密钥使用、密钥轮换、密钥销毁。Jetson 的 eFuse 不支持密钥轮换烧进去就固定了所以轮换只能通过“换新模组”实现这意味着密钥的初始生成必须足够慎重。我的建议是产品线规划时就确定密钥策略是“一条产品线一套密钥”还是“一个批次一套密钥”。前者管理简单但一旦泄露影响面大后者更安全但产线要管理多套密钥。对于大多数中小团队一条产品线一套密钥加严格的离线保管是性价比最高的方案。6.2 产线 SOP让操作员不会犯错产线操作员不是安全专家SOP 要简单到“放料、按键、取料”三步。所有复杂的配置、密钥选择、参数校验都在工装脚本里自动完成。工装界面只显示“开始”“成功”“失败”三个状态失败时给出明确的错误码由工程师处理。SOP 里还要包含异常处理流程烧录失败怎么办、模组变砖怎么标识、怎么隔离不良品。这些流程要贴在工位上操作员能随时看到。6.3 追溯与审计每一片模组都要有“身份证”每片烧录过的模组都要记录模组序列号、ECID、烧录时间、密钥版本、fuse 配置版本、工装编号、操作员编号、烧录结果。这些数据存到数据库支持按批次、按时间、按密钥版本查询。追溯的价值在出问题时体现。比如某批模组在客户端出现启动异常你可以快速定位到是哪个密钥版本、哪个工装、哪个时间段烧录的缩小排查范围。没有追溯你只能全批次召回。6.4 小批量验证与灰度别拿整批货赌一次配置新配置上线时先烧 5-10 片做灰度验证。验证内容包括正常启动、签名固件刷入、未签名固件拒绝、业务程序运行、长时间稳定性。全部通过后再逐步放大批量。灰度期间要保留详细的日志和测试记录。如果灰度发现问题立即停止分析根因修正配置后重新灰度。这个过程看起来慢但比整批报废快得多。7. 烧录之后安全启动链的日常维护eFuse 烧完、安全启动开启不代表可以高枕无忧。后续的固件升级、OTA、产线返修都会和安全策略打交道。固件升级时新固件必须用对应的私钥签名否则模组拒绝启动。所以签名服务器要一直可用私钥要一直安全保管。OTA 流程里要加入签名校验环节确保下发的固件是签过名的。产线返修时如果模组已经烧录 eFuse返修后重新刷固件也必须用签名固件。返修工装要能识别模组的安全状态避免用未签名固件去刷已烧录模组导致启动失败。还有一点容易被忽略开发团队要保留至少一台未烧录 eFuse 的模组用于日常调试和紧急排查。已烧录模组不能随便刷未签名固件调试起来束手束脚。这台“调试专用模组”要明确标识避免误烧。我个人在实际操作中的体会是Jetson eFuse 烧录这件事技术难度不算高难的是流程规范和风险控制。工具链的命令行参数查文档就能会但“什么时候烧、烧之前检查什么、烧之后怎么验证、出问题怎么追溯”这些工程化问题才是决定量产成败的关键。把密钥管理、工装防呆、灰度验证、追溯审计这几件事做扎实eFuse 烧录就从“高危操作”变成了“标准工序”。
返回列表