作者书籍推荐:
⚡ 内地版本:电子工业出版社已出版,并在大陆热销。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 固化在芯片中,它会:
- 读取 eFUSE 公钥哈希;
- 取出镜像中的公钥;
- 对比哈希一致性;
- 用公钥验证签名;
- 成功则加载 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 / Bootloader | Bootloader, 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 的真正意义:从硬件到软件的信任闭环。
982

被折叠的 条评论
为什么被折叠?



