📺 B站视频讲解(Bilibili):博主个人介绍
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
📘 加博主微信,进技术交流群: jerrydev
Jetson Orin 平台 fTPM 全面解析:从 TPM 概念到 OP-TEE 实战(含 EKS/EKB、流程图、对比表)
适用平台:Jetson AGX Orin / Jetson Orin NX / Jetson Orin Nano(Jetson Linux / JetPack 6.x 及后续)
0. 你为什么会遇到 fTPM?
很多同学第一次在 Jetson 上看到 fTPM(Firmware TPM) 的描述,会产生三连疑问:
- TPM 到底是什么?
- fTPM 的“功能”具体做什么?看上去像一堆证书、密钥、EKS/EKB,越看越像“要改 EKS”?
- 没有 fTPM,OP-TEE 会不会就不能工作?
这篇文章把这些问题一次讲清楚:

1. TPM 是什么?全称是什么?它“解决什么问题”?
1.1 TPM 全称
TPM = Trusted Platform Module,中文常译为 可信平台模块。
它的本质不是“一个普通的加密库”,而是一个可被信任的安全根(Root of Trust):
- 能生成并保护密钥(密钥尽量不出芯片/不出安全域)
- 能记录“启动/软件状态”的度量值(PCR)
- 能把密钥或数据“绑定”到某个可信状态(Seal/Unseal)
- 能对外提供“证明我是谁、我现在运行的状态是什么”的证据(Quote / Attestation)
1.2 三个关键词:PCR、NV、Attestation
如果你只记 3 个点,就记这 3 个:
PCR(Platform Configuration Register)
- TPM 里一组“只能追加(extend)”的寄存器,用来存放度量值。
- PCR 不是直接写入“某个值”,而是“旧值 + 新事件哈希”不断累积,形成不可逆的链。
NV(Non-Volatile Storage)
- TPM 内部/绑定 TPM 的非易失存储(类似小型安全 NVRAM)。
- 常用于存放证书、计数器、策略、设备身份相关的数据。
Attestation(远程证明/状态证明)
-
TPM 可以对 PCR 等状态做签名(Quote),让远端验证:
- 这台设备是否是“某个真实 TPM 实例”(设备身份)
- 设备当前启动状态是否符合预期(度量状态)
1.3 TPM 的典型用途(你在工程里会遇到的)
-
设备唯一身份(Device Identity):用 EK/AK 体系做可信身份根。
-
安全启动增强(Secure Boot + Measured Boot):
- Secure Boot:不允许未授权镜像启动(“验证/放行”)
- Measured Boot:把启动过程的关键组件哈希写入 PCR(“记录/可证明”)
-
磁盘加密密钥绑定(Seal LUKS key to PCR):只有在符合 PCR 状态时才放出解密密钥。
-
防回滚、可信计数器:用 NV counter 类能力做防回滚策略。
-
云端设备注册/零接触部署:云端用 EK 证书链确认设备真实身份。
重要提醒:TPM 不等价于“安全启动”。它更像一个“可证明的安全根 + 密钥与状态绑定器”。
2. dTPM、fTPM、swtpm:它们到底有什么区别?
TPM 的“实现形态”主要有三类:
- dTPM(Discrete TPM):独立硬件 TPM 芯片(SPI/I2C/LPC…)
- fTPM(Firmware TPM):固件/安全域实现的 TPM(典型运行在 TrustZone/TEE)
- swtpm(Software TPM):纯软件模拟(主要用于开发/测试)
下面这张表非常关键:
| 安全边界 | 芯片物理隔离,抗攻击强 | 依赖 TEE/安全域隔离 | 依赖 OS 隔离,基本不算硬安全 |
| 成本/BOM | 增加器件与布线 | 不增加外部器件 | 0 |
| 供应链/认证 | 更容易做硬件级证明 | 依赖平台安全能力与实现质量 | 不适合生产 |
| 性能 | 通常较稳定 | 取决于 TEE 与实现 | 取决于 CPU |
| 设备端接口 | SPI/I2C/LPC 等 | 内核驱动 + TEE 通道 | socket/文件等 |
| 典型用途 | 服务器/企业安全/高强度 | 移动/嵌入式/成本敏感 | CI、仿真、功能开发 |
在 Jetson Orin 平台上,NVIDIA 提供的是 fTPM 方案:
- 以 TPM 2.0 规范参考实现为基础
- 通过 OP-TEE 在安全世界运行一个 fTPM TA(Trusted Application)
- 在普通世界(Linux)使用标准 TSS(TPM Software Stack) 与之交互
3. fTPM 的“功能”到底是什么?一句话讲清
fTPM 的功能就是:在“安全世界(OP-TEE)”里提供一个符合 TPM 2.0 规范的 TPM 实例,让 Linux 像访问真实 TPM 芯片一样访问它。
换句话说:
- 你运行 tpm2_pcrread、tpm2_nvread、tpm2_quote 这类命令时
- 上层仍然走标准 TPM2.0 命令集
- 只是“TPM 实体”不是外置芯片,而是 OP-TEE 中的 fTPM TA
它的价值主要体现在:
4. Jetson 上的 fTPM 软件架构:一张图看懂
先看“从应用到 fTPM TA”的完整链路(建议你把这张图记住):
+————————————————————–+
| Linux 普通世界 |
| |
| [应用] tpm2-tools / 应用程序 / pkcs11 / systemd-cryptenroll |
| | |
| v |
| [TSS] tpm2-tss (ESAPI/FAPI) |
| | (TCTI=device:/dev/tpmrm0) |
| v |
| /dev/tpmrm0 (内核 TPM Resource Manager 设备) |
| | |
| v |
| Linux Kernel: tpm + tpm_ftpm_tee + tee/optee driver |
| | (把 TPM 命令转发到 TEE) |
+———-|—————————————————+
v
+————————————————————–+
| 安全世界(OP-TEE) |
| |
| [fTPM TA] TPM2.0 参考实现封装成 TA |
| | |
| v |
| Secure Storage / Key Derivation / SE Keyslot / (可选 RPMB) |
+————————————————————–+
这张图对应你常见的“看不懂点”:
-
TSS 是什么?
- TPM Software Stack,用户态的软件栈,让应用以统一方式访问 TPM。
- 你用 tpm2-tools,其实就是在用 TSS。
-
tpm_ftpm_tee 是什么?
- Linux 内核中专门用于“固件 TPM(TEE 里的 TPM)”的驱动模块。
- 它把 TPM 命令转发给 OP-TEE 的 TA。
-
fTPM TA 是什么?
- 运行在 OP-TEE 中的“可信应用”,实现 TPM2.0 命令处理、NV、密钥等。
5. fTPM 和 EKS/EKB 到底什么关系?是不是“要改 EKS”?
你问得非常准确:很多资料同时出现 EKS、EKB、证书、Provisioning,很容易让人误会“fTPM 需要去改 EKS”。
结论先说:
- fTPM 不等价于 EKS,也不是“去改 EKS”。
- EKS/EKB 是 fTPM provisioning(出厂配置)过程中“携带材料”的一种方式。
5.1 两个名词先分清
- EKS(Encrypted Key Store):Jetson 的一个分区/存储区域,用于放置“加密的密钥材料镜像”。
- EKB(Encrypted Key Blob):被加密封装后的“密钥材料包”,会被写入 EKS 分区。
你可以把它类比成:
- EKS:保险箱(存放位置/分区)
- EKB:装在保险箱里的密封文件袋(加密后的材料包)
5.2 fTPM provisioning 为什么要用到 EKB?
要让每台设备的 fTPM 都“可被信任”,必须解决一个关键点:
每台设备要有唯一的身份材料(例如 EK 相关证书/种子),且这个材料要在生产制造阶段被安全地注入。
在 Jetson 的设计里,离线 provisioning 的核心思路是:
制造阶段为每台设备生成必要材料(Device_SN、种子、EK 证书等)。
把这些材料编码进 EKB 并写入 EKS 分区。
设备首次启动后运行 provisioning 工具:
- 从 EKB 里取出 EK 证书
- 写入 fTPM 的 NV 存储
- 设置 owner 授权等
用流程图表示就是:
(制造/工厂侧)
生成每台设备唯一材料 + EK CSR -> CA 签发 EK 证书
|
v
打包并加密成 EKB
|
v
写入设备的 EKS 分区
(设备首次启动)
OP-TEE 初始化 fTPM TA
|
v
provisioning 工具从 EKB 提取 EK 证书
|
v
将 EK 证书写入 fTPM NV,并设置 owner auth
|
v
Linux 侧开始以“可信 TPM”方式使用(EK/AK/Quote 等)
5.3 为什么 provisioning 后要写入 fTPM NV?
因为很多云端/平台需要通过 EK 证书链 来“认这台设备”。
- 证书在 EKB 里是“材料来源”,不代表 TPM 已经准备好对外提供标准 EK/NV 行为。
- provisioning 把材料写进 fTPM NV 后,TPM 才能用标准命令返回对应证书/对象。
一句话:EKB 是“出厂包裹”,NV 是“TPM 自己的身份证与持久化区”。
6. 没有 fTPM,OP-TEE 就不能正常工作吗?
不会。
- OP-TEE 是一个通用 TEE:它负责提供安全世界运行环境、TA 框架、Secure Storage、密钥派生等能力。
- fTPM 只是 OP-TEE 里的一个 TA(功能模块):你可以启用,也可以不启用。
但是有两个实际工程现象要注意:
如果你启用了 fTPM,但发现 fTPM 不工作,很多时候根因是 OP-TEE 整体链路异常(tee-supplicant、存储后端、TA 部署等)。
反过来,OP-TEE 正常并不意味着 fTPM 一定可用,因为 fTPM 还涉及:
- TA 是否编译进 tos.img
- Linux 内核是否有 tpm_ftpm_tee
- provisioning 是否完成
7. 实战:在 Jetson 上把 fTPM 跑起来(从 0 到可验证)
下面给一套“最小可复现”的实战路径。目标是:
- 让 /dev/tpm0 / /dev/tpmrm0 出现
- 完成 provisioning(写入 EK 证书、设置 owner auth)
- 用 tpm2-tools 验证 PCR/NV/随机数/基本能力
说明:不同 Jetson Linux/JetPack 版本目录结构略有差异;你可以按“思路与关键点”对照落地。
7.1 先确认 OP-TEE 基础链路
在设备上执行:
ls -l /dev/tee*
通常会看到 /dev/tee0。
再看服务(不同版本名称可能略有差异):
systemctl status nv-tee-supplicant.service
# 或者:systemctl status tee-supplicant
如果 tee-supplicant 没起来,内核到 OP-TEE TA 的访问会出现各种异常。
7.2 加载 fTPM 内核驱动(关键一步)
sudo modprobe tpm_ftpm_tee
成功后检查:
ls -l /dev/tpm*
你通常会看到:
- /dev/tpm0:TPM 设备节点
- /dev/tpmrm0:TPM Resource Manager(推荐优先使用)
提示:现代 Linux 推荐用 /dev/tpmrm0,它能让多进程并发访问更稳定。
7.3 provisioning:把 EK 证书写入 fTPM NV,并设置 owner auth
在 NVIDIA 的 fTPM 文档流程里,provisioning 脚本会完成:
- 查询 EK 证书(RSA/EC)
- 存入 fTPM NV
- 设置 fTPM 授权(owner auth)
典型命令形式如下:
cd ftpm_prov
sudo ./ftpm_device_provision.sh -r ek_cert_rsa.der -e ek_cert_ec.der -p owner
参数含义:
- -r ek_cert_rsa.der:从 EKB 查询并导出的 RSA EK 证书文件
- -e ek_cert_ec.der:从 EKB 查询并导出的 EC EK 证书文件
- -p owner:fTPM owner 授权口令(示例用 owner,你应按产品策略设置)
核心点:provisioning 是让设备“成为一个可被信任的 TPM 实体”的关键步骤。只把 TA 编译进去、驱动加载成功,往往还不够。
provisioning 脚本在哪里?
常见做法是从 host 侧把脚本拷到设备上,来源一般在 OP-TEE samples 里,例如(示意):
# 在 host 上(根据你的源码包实际路径调整)
scp optee/samples/ftpm-helper/host/tool/ftpm_device_provision.sh <device_ip>:/home/<user>/ftpm_prov/
如果你在 BSP 源码包里找不到,优先以你当前 Jetson Linux 版本的官方说明为准。
8. 用 tpm2-tools 快速验证 fTPM 是否真的“能用”
8.1 安装工具
sudo apt update
sudo apt install -y tpm2-tools
建议显式指定 TCTI 走 /dev/tpmrm0:
export TPM2TOOLS_TCTI="device:/dev/tpmrm0"
8.2 查看 TPM 能力列表
tpm2_getcap -l
能正常输出一大串 capability,说明 TSS -> 内核 -> fTPM TA 的链路基本通。
8.3 读取 PCR(理解“状态寄存器”)
tpm2_pcrread
# 或者只看某些:
tpm2_pcrread sha256:0,7
你会看到各 bank(sha1/sha256…)以及对应 PCR 的值。
8.4 做一次 PCR extend(让你直观理解“只能累积”)
用 tpm2_pcrevent 最简单:它会对文件/输入做 hash 并 extend 到 PCR。
echo -n "hello-ftpm" | tpm2_pcrevent – 16
# 再读一次 PCR16:
tpm2_pcrread sha256:16
你会发现 PCR16 的值发生变化,而且这种变化是“累积链式”的。
注意:实际产品中哪些 PCR 允许 extend、由谁 extend,需要由启动链/策略决定。这里是为了演示与理解。
8.5 验证 NV:在 TPM 里存一段数据再读出来
下面演示“定义 NV index -> 写入 -> 读取 -> 删除”。
# 1) 定义一个 32 字节的 NV index(示例用 0x1500016)
sudo tpm2_nvdefine 0x1500016 -C o -s 32 -a "ownerread|ownerwrite|policywrite"
# 2) 写入数据(准备一个文件)
echo -n "ftpm-nv-demo" > nv.dat
sudo tpm2_nvwrite -C o -i nv.dat 0x1500016
# 3) 读回(读 32 字节)
sudo tpm2_nvread -C o -s 32 0x1500016
# 4) 用完删除(可选)
sudo tpm2_nvundefine -C o 0x1500016
如果这组命令能正常跑通,说明:
- fTPM 的 NV 路径可用
- OP-TEE 的 secure storage 后端至少能满足基础持久化需求
9. /dev/tpm0 与 /dev/tpmrm0:为什么你应该优先用 tpmrm0?
很多人看到两个设备节点会困惑。简单说:
- /dev/tpm0:直接 TPM 设备
- /dev/tpmrm0:内核 resource manager(会帮你处理 session/对象并发)
对比表:
| /dev/tpm0 | 直接访问 TPM | 单进程/简单测试 | 能用但不优先 |
| /dev/tpmrm0 | 内核资源管理 | 多进程并发、系统服务、长期运行 | 优先使用 |
10. fTPM 与 Secure Boot / Measured Boot:别混在一起
这里再把最容易混淆的一点讲透:
- Secure Boot(验证启动):核心是“只允许授权组件启动”。
- Measured Boot(度量启动):核心是“把启动关键组件的哈希写进 PCR,并可对外证明”。
两者关系:
- Secure Boot 更像“门禁”
- Measured Boot 更像“全程录像 + 可验真”
fTPM 主要给 Measured Boot 与 Attestation 提供标准接口,但它也常被用于“把密钥释放绑定到状态”(Seal/Unseal),从而与 Secure Boot 形成互补。
11. Jetson 上 fTPM 持久化背后依赖什么?为什么经常踩坑?
fTPM 需要存储一些持久化状态(NV 索引、计数器、证书等)。在 Jetson 平台上,这通常依赖 OP-TEE 的 Secure Storage 后端:
- REE FS:依赖普通世界文件系统(默认常用)
- RPMB:依赖 eMMC 的 RPMB 分区(更强的抗回放/抗篡改能力,但并非所有 SKU/版本都支持)
你需要特别注意两个点:
不同 Jetson Linux 版本/不同模块 SKU 对 RPMB 支持情况可能不同。
如果使用 REE FS 作为 secure storage 后端,必须确保保存位置不会被“factory reset/清理机制”抹掉,否则会导致:
- fTPM NV 丢失
- 设备身份变化/密钥变化
- 远程证明体系崩溃
工程建议:
- 评估产品形态与 Jetson Linux 版本支持情况,能用 RPMB 优先用。
- 若使用 REE FS,确保 OP-TEE secure storage 路径位于可靠持久化分区,并受系统策略保护。
12. 常见问题排查清单(非常实用)
12.1 modprobe 成功但没有 /dev/tpm0
- 检查内核是否启用 TPM 与 tpm_ftpm_tee:
dmesg | grep -i tpm
lsmod | grep tpm
- 检查 OP-TEE 通道:
dmesg | grep -i tee
ls -l /dev/tee0
12.2 /dev/tpm0 有了,但 tpm2-tools 报错
- 优先用 /dev/tpmrm0:
export TPM2TOOLS_TCTI="device:/dev/tpmrm0"
- 再跑 tpm2_getcap -l 看是否链路通。
12.3 NV 操作失败或 provisioning 失败
- 很多与 OP-TEE secure storage 后端有关:路径不可写、被清理、权限/挂载问题。
- 确认 tee-supplicant 服务正常。
12.4 provisioning 做完了,为什么还要关心 EK 证书?
因为没有 EK 证书/可信链,远端系统很难“认”你的 TPM 身份。
13. 结语:用一句工程化的话总结 fTPM
在 Jetson Orin 上,fTPM = “用 OP-TEE 把 TPM2.0 做成一个 TA”,让 Linux 通过标准 TSS/TPM 设备接口获得:设备身份、度量状态(PCR)、密钥绑定与远程证明能力。
它与 EKS/EKB 的关系不是“改 EKS”,而是“出厂 provisioning 的材料投递方式”;没有 fTPM,OP-TEE 仍然可以工作,但 fTPM 是 OP-TEE 在平台可信体系里的一个非常典型、非常实用的安全服务。
参考资料(建议收藏)
-
NVIDIA Jetson Linux Developer Guide – Firmware TPM(不同版本 URL 会变化,请以你使用的 Jetson Linux 版本为准)
- https://docs.nvidia.com/jetson/
-
Linux 内核文档:tpm_ftpm_tee 驱动说明
- https://docs.kernel.org/security/tpm/tpm_ftpm_tee.html
-
TPM2 工具链(tpm2-tools / tpm2-tss)
- https://tpm2-tools.readthedocs.io/
-
TCG(Trusted Computing Group)TPM 2.0 规范与文档入口
- https://trustedcomputinggroup.org/
📺 B站视频讲解(Bilibili):博主个人介绍
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
📘 加博主微信,进技术交流群: jerrydev
网硕互联帮助中心





评论前必须登录!
注册