4. TPM软件栈

TPM 芯片本身只提供有限的命令接口,真正让应用、操作系统和运维人员能够方便调用 TPM 的,是位于内核与用户态之间的软件栈。理解 TSS、TAB、TrouSerS、tpm2-tools 等组件的层次关系,是后续进行可信计算故障诊断与调试的基础。本节从软件栈结构入手,说明各组件的职责、安装配置方法及典型使用场景。

一、TPM 软件栈的分层结构

TPM 软件栈通常分为四层:最底层是 TPM 硬件芯片或固件 TPM(fTPM);其上是内核驱动层,Linux 中主要是 tpm、tpm_tis、tpm_crb 等模块;再往上是系统 API 层,包括 TSS(TCG Software Stack)及其实现;最上层是面向用户和脚本的工具层,如 tpm2-tools、TrouSerS 工具集。TAB(TPM Access Broker)和资源管理器(Resource Manager)则位于 TSS 内部,负责多进程并发访问 TPM 时的仲裁与资源调度。

TPM 软件栈分层与数据流 应用与运维层 tpm2-tools 命令行 · TrouSerS 工具集 · 自研程序 · 密钥管理服务 TSS 层(TCG Software Stack) TAB TPM Access Broker 资源管理器 Resource Manager TCTI 传输接口抽象 内核驱动层 tpm · tpm_tis · tpm_crb · /dev/tpm0 · /dev/tpmrm0 TPM 硬件 / 固件 离散 TPM 芯片 · 固件 TPM(fTPM)· TPM 2.0 / 1.2 并发仲裁

二、核心组件职责与安装配置

TSS(TCG Software Stack)是 TCG 定义的标准软件栈规范,规定了上层应用与 TPM 交互的 API 接口。Linux 下主流实现是 tpm2-tss,它提供 SAPI(System API)、ESAPI(Enhanced System API)和 FAPI(Feature API)三层接口。安装方式通常为:

# Debian/Ubuntu
sudo apt install tpm2-tss libtss2-dev

# RHEL/CentOS
sudo dnf install tpm2-tss tpm2-tss-devel

# 验证 TSS 版本
tpm2_startup --version

TAB(TPM Access Broker)是 TSS 中的关键组件,负责在多个进程同时访问 TPM 时进行仲裁,防止命令交错导致 TPM 状态混乱。TAB 通常与资源管理器一起工作:资源管理器负责将 TPM 有限的内部资源(如会话、对象句柄)换入换出,TAB 则保证同一时刻只有一个进程的命令序列进入 TPM。在 tpm2-tss 中,TAB 由 tpm2-abrmd 守护进程实现。

# 安装并启动 TAB 守护进程
sudo apt install tpm2-abrmd
sudo systemctl enable --now tpm2-abrmd

# 检查状态
systemctl status tpm2-abrmd
# 指定 TCTI 使用 TAB
export TPM2TOOLS_TCTI="tabrmd:bus_name=com.intel.tss2.Tabrmd"

TrouSerS是较早的 TPM 1.2 软件栈实现,提供 tcsd 守护进程和 tpm_* 系列工具。在 TPM 2.0 环境中,TrouSerS 已逐步被 tpm2-tss 取代,但在一些遗留系统和 TPM 1.2 设备上仍在使用。其典型配置为编辑 /etc/tcsd.conf,设置 port、system_ps_file 等参数后启动 tcsd。

tpm2-tools是面向 TPM 2.0 的命令行工具集,封装了 TSS 的 ESAPI,提供 tpm2_createprimary、tpm2_create、tpm2_load、tpm2_unseal、tpm2_pcrread 等命令,是日常调试和脚本化操作的主力工具。

# 安装 tpm2-tools
sudo apt install tpm2-tools

# 读取 PCR 0-7
tpm2_pcrread sha256:0,1,2,3,4,5,6,7

# 创建主密钥
tpm2_createprimary -C o -c primary.ctx

# 查看 TPM 属性
tpm2_getcap properties-fixed

三、工具链协同工作流程

一次典型的 TPM 操作,数据流如下:用户执行 tpm2_pcrread → tpm2-tools 调用 ESAPI → ESAPI 通过 TCTI 选择传输通道(device 或 tabrmd)→ 若使用 TAB,则请求经 tpm2-abrmd 仲裁后转发 → 内核驱动 /dev/tpm0 或 /dev/tpmrm0 → TPM 硬件执行命令 → 结果沿原路返回。若 TCTI 配置错误或 TAB 未启动,常见报错为 Failed to connect to TABRMD 或 No such device。

组件 职责 典型安装包 关键配置/命令
TSS 标准 API 层,提供 SAPI/ESAPI/FAPI tpm2-tss libtss2-dev、TCTI 环境变量
TAB 多进程访问仲裁 tpm2-abrmd systemctl start tpm2-abrmd
资源管理器 TPM 内部资源换入换出 tpm2-tss(内核 rm) /dev/tpmrm0
TrouSerS TPM 1.2 软件栈与工具 trousers、tpm-tools /etc/tcsd.conf、tcsd
tpm2-tools TPM 2.0 命令行工具集 tpm2-tools tpm2_pcrread、tpm2_createprimary

四、典型故障场景与复盘

场景一:TCTI 未指定导致连接失败。执行 tpm2_pcrread 报错 ERROR: tcti: /dev/tpm0 not found。原因是系统使用 TAB 但未设置 TPM2TOOLS_TCTI。解决:export TPM2TOOLS_TCTI="tabrmd:bus_name=com.intel.tss2.Tabrmd",或改用 device:/dev/tpmrm0。

场景二:TAB 与内核资源管理器冲突。同时启用 tpm2-abrmd 和 /dev/tpmrm0 可能导致资源句柄混乱。建议二选一:桌面/多进程场景用 TAB,嵌入式单进程场景直接用 /dev/tpmrm0。

复盘要点:TPM 软件栈问题大多集中在 TCTI 配置、TAB 状态、权限(/dev/tpm0 属主)和内核模块加载四个方面。排查时按“工具 → TSS → TCTI → 驱动 → 硬件”自顶向下逐层验证,可快速定位故障层。掌握这套工具链的安装与配置,是后续进行 PCR 度量、密钥封装和远程证明调试的前提。