云计算百科
云计算领域专业知识百科平台

Jetson Orin 平台 fTPM 全面解析:从 TPM 概念到 OP-TEE 实战(含 EKS/EKB、流程图、对比表)


📺 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 会不会就不能工作?

这篇文章把这些问题一次讲清楚:

  • 先用最直观的方式解释 TPM 的“核心价值”。
  • 再把 Jetson 上的 fTPM 架构画成一张图,让你能把“用户态工具、内核驱动、OP-TEE、TA、EKS/EKB、Secure Storage”串起来。
  • 最后给出一套可在板子上直接跑通的实战步骤:从驱动加载、Provisioning(初始化/写入 EK 证书/设置 owner auth),到用 tpm2-tools 验证 PCR / NV / Quote 的基本能力。

  • 在这里插入图片描述

    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):纯软件模拟(主要用于开发/测试)

    下面这张表非常关键:

    维度dTPM(独立芯片)fTPM(固件TPM,TEE中)swtpm(软件模拟)
    安全边界 芯片物理隔离,抗攻击强 依赖 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

    它的价值主要体现在:

  • 把密钥操作放进安全世界:降低密钥在普通世界暴露的风险。
  • 提供可证明的设备身份:通过 EK/证书体系让远端信任该设备。
  • 为 measured boot / sealed storage 提供标准接口:把“状态”和“密钥释放”关联起来。

  • 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


    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Jetson Orin 平台 fTPM 全面解析:从 TPM 概念到 OP-TEE 实战(含 EKS/EKB、流程图、对比表)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!