Jetson Secure Boot全链路讲解:从eFUSE到Kernel的可信启动实战


作者书籍推荐:
内地版本:电子工业出版社已出版,并在大陆热销。Yocto项目实战教程:高效定制嵌入式Linux系统
🎥 更多学习视频请关注 B 站:嵌入式Jerry


Jetson Secure Boot全链路讲解:从eFUSE到Kernel的可信启动实战

本文以 NVIDIA Jetson AGX Orin 为例,系统讲解 Secure Boot 的完整逻辑:从 eFUSE 公钥哈希的写入,到 Bootloader、Kernel 的验证机制,再到运行阶段的安全策略。通过图表、实例与配置代码,帮你彻底搞懂“启动可信”与“运行可信”的区别与落地方法。


在这里插入图片描述

1️⃣ 什么是 Secure Boot?

Secure Boot(安全启动) 是让设备从上电那一刻起,只能运行“被信任的镜像”。它的核心目标是防止:

  • 启动链被篡改(假 Bootloader、假 Kernel)
  • 恶意固件被植入(未经授权系统)
  • 未签名的驱动或模块注入

其核心机制是:公钥/私钥签名验证 + eFUSE 硬件锁定


2️⃣ Secure Boot 的核心逻辑图

┌────────────┐
│  eFUSE 公钥哈希 │  ← 烧入芯片,不可更改
└───────┬────┘
        │  BootROM 验证 Bootloader 签名
┌───────▼────┐
│ Bootloader │  ← 用公钥验证 Kernel / OP-TEE / DTB
└───────┬────┘
        │  验证通过继续加载
┌───────▼────┐
│  Kernel    │  ← 验证模块签名 (运行阶段)
└────────────┘

一条自上而下的“信任链”,称为 Chain of Trust


在这里插入图片描述

3️⃣ eFUSE:信任根(Root of Trust)

eFUSE 是芯片内的一次性可编程存储区,用来永久存储安全信息。

内容是否可改说明
公钥哈希PKC Hash (SHA256)芯片启动时使用它验证 Bootloader 签名
Secure Boot 启用位SecureBootEnable决定是否强制签名验证
调试禁用JTAG Disable禁止低级硬件调试

当你执行:

odmfuse.sh --secureboot --pkc pkc_pubkey.pem

SoC 就会把公钥哈希写入 eFUSE,从此 BootROM 只能信任匹配此哈希的签名。

⚠️ 一旦烧入 eFUSE,不可恢复。务必使用测试样机预演。


4️⃣ Bootloader 阶段的签名与验证

Bootloader 是 Secure Boot 的第一个验证目标。

4.1 构建签名

使用 tegrasign 签名 Bootloader:

tegrasign --key priv.pem --file mb2_bootloader.bin --getmontgomeryvalues montgomery.txt

签名文件将附加到镜像中或写入签名区。

4.2 BootROM 启动验证

BootROM 固化在芯片中,它会:

  1. 读取 eFUSE 公钥哈希;
  2. 取出镜像中的公钥;
  3. 对比哈希一致性;
  4. 用公钥验证签名;
  5. 成功则加载 Bootloader,否则拒绝启动。

4.3 Bootloader 验证下一级

Bootloader 自身内置验证链,通过配置文件定义签名策略:

<sign_config>
    <file name="boot.img" sign="true" key="priv.pem"/>
    <file name="kernel_dtb.dtb" sign="true" key="priv.pem"/>
    <file name="tos.img" sign="true" key="priv.pem"/>
</sign_config>

这样 Bootloader 会在启动时验证:

  • Kernel 镜像
  • 设备树(DTB)
  • OP-TEE 安全固件

✅ 确保“启动链完整性”:别人换 Kernel 也无法启动。


5️⃣ Kernel 阶段:运行安全的关键

如果 Bootloader 验签了 Kernel,那么系统能保证启动时没被篡改。
但 Kernel 启动后,仍可能被攻击者注入恶意模块。

因此 Kernel 还要具备运行时保护:

CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_ALL=y
CONFIG_MODULE_SIG_SHA256=y
CONFIG_SYSTEM_TRUSTED_KEYS="certs/signing_key.pem"
CONFIG_KEXEC_VERIFY_SIG=y
CONFIG_SECURITY_LOCKDOWN_LSM=y
CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY=y
功能作用
模块签名限制加载未签名驱动
Kexec 验签防止加载未签名的二级内核
Lockdown禁止 /dev/mem、MSR 等危险接口

Bootloader 管“谁能开门”;Kernel 管“进来后谁能动家里的东西”。


6️⃣ Secure Boot 两个阶段的关系

阶段验证者对象目标是否需改内核
启动前BootROM / BootloaderBootloader, Kernel, DTB启动前镜像完整性❌ 不需要
启动后Kernel 自身模块, 内核接口运行时完整性✅ 建议开启

如果你只想防止“假系统启动”,可以只做 Secure Boot,不改内核。
如果还想防止“系统被插模块、提权”,就要启用 Kernel 安全配置。


7️⃣ 实战:最小可行配置(仅保证启动可信)

以下配置能让 Jetson 在不改 Kernel 的前提下启用 Secure Boot:

# 1. 生成公钥/私钥
openssl genrsa -out priv.pem 4096
openssl rsa -in priv.pem -pubout -out pub.pem

# 2. 烧入 eFUSE
odmfuse.sh --secureboot --pkc pub.pem

# 3. 签名镜像
tegrasign --key priv.pem --file mb2_bootloader.bin
tegrasign --key priv.pem --file kernel_dtb.dtb
tegrasign --key priv.pem --file boot.img

# 4. 更新 sign_config.xml 并重新打包
tegrabct_v2 --update sign_config.xml

✅ 启动链完全可信。
❌ Kernel 启动后仍可能被插入未签名模块。


8️⃣ 更高安全等级(启动 + 运行可信)

启用 Kernel 模块签名后:

  • 未签名 .ko 驱动无法加载;
  • OTA 更新也需带签名;
  • /dev/mem 调试被禁用。

在 Yocto 中可加入以下配置:

# linux-jetson-secureboot.cfg
CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_ALL=y
CONFIG_SYSTEM_TRUSTED_KEYS="certs/signing_key.pem"
CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY=y

9️⃣ Bootloader 与 Kernel 配置关系总结表

层级是否需要签名谁验证保护范围是否要改内核
Bootloader✅ 必须签BootROM启动链
Kernel 镜像✅ 必须签Bootloader启动完整性
模块 (.ko)✅ 建议签Kernel运行完整性

🔐 10️⃣ 一图看懂 Secure Boot 双层防护逻辑

            启动阶段                   运行阶段
┌────────────────────┐     ┌────────────────────┐
│ BootROM 验 Bootloader │     │ Kernel 验模块签名 │
│ Bootloader 验 Kernel │     │ Lockdown 防调试接口 │
└────────────────────┘     └────────────────────┘
           ↓                              ↓
       启动可信 ✅                 运行可信 ✅

✅ 结论总结

场景推荐方案安全等级
只想防止假系统启动Secure Boot(eFUSE + Bootloader签名)⭐⭐⭐
同时防止运行时被插模块Secure Boot + Kernel 模块签名⭐⭐⭐⭐
高安全/车规/工控场景Secure Boot + Lockdown + IMA/EVM⭐⭐⭐⭐⭐

Secure Boot 负责“让系统起得对”;
Kernel 安全负责“让系统跑得稳”。


📘 关键命令备忘

# 签名镜像
tegrasign --key priv.pem --file <target>

# 验证签名(BootROM 自动完成)
odmfuse.sh --verify --pkc pub.pem

# 检查 Lockdown 状态
cat /sys/kernel/security/lockdown

# 模块签名状态
modinfo <module>.ko | grep signer

🧩 参考结构

  • 硬件层:eFUSE 公钥哈希(Root of Trust)
  • Boot 阶段:Bootloader 验签机制(tegrasign + sign_config)
  • Kernel 层:模块签名验证 + Lockdown
  • OTA 阶段:更新包签名 + 健康检查

最终形成的完整链:

eFUSE (公钥哈希)
    ↓
BootROM → Bootloader → Kernel → Module → Application

从芯片出厂到系统运行的每一步,都必须经过签名验证。
这就是 Secure Boot 的真正意义:从硬件到软件的信任闭环

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值