PC/104-Plus板载TPM 2.0:从选型验证到安全部署的工程实践
2026/8/27 13:54:59 网站建设 项目流程

这些年做嵌入式选型,我发现自己看数据手册的顺序变了。以前先看 CPU 主频、内存、串口数量,现在多了一条硬指标:板载安全芯片。这条指标最典型的落点,就是 PC/104-Plus 单板计算机上的 On-Board TPM Security。这里说的 TPM 是 Trusted Platform Module,可信平台模块,跟大模型圈子里那个 token per minute 吞吐量统计没有半点关系,SBC 就是 Single Board Computer,单板计算机。一台 90mm x 96mm 的小板子,焊一颗指甲盖大小的安全芯片,看起来不起眼,但轨交、电力、工业网关这些场景的甲方已经开始把“设备能否自证没被篡改”写进招标要求了。

以前我也觉得,TPM 是 PC 上装 Windows 11 才需要折腾的东西,工业板卡只要稳定可靠就行。直到我负责的项目被客户提了一串安全问题:固件被人改了怎么办?加密盘的密钥存在哪?远程怎么确认设备还是原装的?我才认真把板载 TPM 从选型到落地捋了一遍。这篇文章就把整个过程、坑点和可以直接抄的验证、部署方法整理出来,给准备在 PC/104-Plus 这类嵌入式平台上引入硬件信任根的同行做个参考。

1. 为什么工业嵌入式板卡开始标配安全芯片

1.1 信任模型变了:封闭网络不再是护城河

过去工控设备谈安全,默认靠的是物理隔离。设备在专网里跑,机房有门禁,通信走私有协议,攻击者想接触设备得先进机房。这套模型在设备联网之后就绷不住了。现在电力终端、轨旁设备、工业网关几乎都要接远程运维通道,OTA 升级包在网络上传输,调试接口也越来越多。攻击者不需要出现在现场,只要拿到一个固件包、一段调试日志,甚至从供应链环节做手脚,就能让设备在启动过程中执行恶意代码。

在这种威胁模型下,系统需要一个“启动时能自证清白”的机制:固件是谁签名的?引导加载程序有没有被动过?内核和文件系统是否完整?这些问题不能靠软件自己回答,因为软件本身可能就是被篡改的对象。必须有一个软件无法伪造、无法读取私密内容的硬件信任根,在启动过程中一级一级度量、校验、记录,形成一条可信链。TPM 就是干这个的。

TPM 不是普通的存储芯片,它是一颗独立的密码学协处理器。密钥、平台配置寄存器(PCR)度量值都存在芯片内部,外部程序只能在授权条件下请求它执行加解密、签名、哈希扩展等操作,私钥永远无法被读出。焊接在主板上之后,就算攻击者拿到了 root 权限,也拿不到 TPM 保护的密钥;想物理拆芯片研究,成本和门槛又上升了一大截。对一个需要长期运营的嵌入式系统来说,这个信任根意义完全不同了。

1.2 板载 vs 后插式 TPM:差的不只是一颗芯片的位置

早期在很多单板计算机上,TPM 是可选配置,要么不焊,要么通过一组插针外接一个小模块。PC/104-Plus 本身是堆叠式结构,板上空间很紧,后插 TPM 模块确实给了用户灵活性,但也带来几个明显问题。

第一是物理安全不可控。外接模块裸露在板卡之外,攻击者可以拔掉它,换成一颗自己控制的芯片。信任根被替换,整个可信链就不成立了。第二是兼容性坑多。后插模块的固件版本、EEPROM 内容和主板 BIOS 的适配是后配的,经常出现“模块插上了但 OS 认不到”的情况。第三是机械可靠性。PC/104-Plus 多板堆叠环境下,板卡之间靠四角的铜柱和总线连接器固定,设备长期振动后,外接模块很容易接触不良。

板载 TPM 的本质区别在于,信任根和 CPU 主板在制造环节就绑定在一起。芯片直接焊在 PCB 上,BIOS 在出厂前已经完成了 TPM 初始化、ACPI 表和驱动配置的联调,用户拿到手就是完整可用的状态。缺点是如果芯片损坏,维修成本高一些,但我个人认为对工控板卡来说,这个取舍是划算的,毕竟稳定性和可信性优先。

1.3 必须认准 TPM 2.0:和 1.2 的差异是质变

选型的时候要注意,TPM 有 1.2 和 2.0 两个大版本。虽然都是“可信平台模块”,但差距非常明显:

对比项TPM 1.2TPM 2.0
主要算法SHA-1、RSASHA-256、ECC、RSA、HMAC 等
密码算法固定性算法固定,难以扩展算法灵活,支持多种算法族
密钥层次相对单一多级密钥层次,授权策略更灵活
PCR 数量24 个左右数量和定义更灵活
授权模型仅授权口令支持策略授权、多因素授权
操作系统支持正在淘汰Windows 11、主流 Linux 原生支持
工业合规难以满足新规新一代标准基本都要求 2.0

SHA-1 的碰撞攻击已经从理论走向实用,TPM 1.2 的根基已经不可靠了。另一方面,Windows 11 强制要求 TPM 2.0,很多嵌入式项目要跑 Windows IoT Enterprise,如果板卡只带 1.2 直接没法装系统。再加上国产生态逐步演进,TPM 2.0 对国密算法的支持也更友好(这一点具体看芯片厂商适配,但在选型层面已经不再被 1.2 卡死)。总之一句话:新选型直接锁定 TPM 2.0,不要为了省一点成本去买老库存。

2. PC/104-Plus 总线形态对 TPM 部署的特殊约束

2.1 自堆叠结构里的信任根归属问题

PC/104-Plus 的一个关键特性是自堆叠:不需要背板,板卡通过上下两排总线连接器叠在一起,常见组合是 CPU 主板 + 数据采集板 + 通信板。这种结构在体积上占优势,但对安全设计有一个隐含要求:信任根必须放在启动路径的最前端。

PC/104-Plus 总线同时包含 ISA 和 PCI,现代芯片组上的 TPM 通常挂在 LPC 或 eSPI 总线上,而不是 PCI 总线上。LPC/eSPI 是芯片组内部比较底层的总线,CPU 在 POST 早期就能访问它。也就是说,TPM 必须和 CPU 在同一块主板上,或者在 CPU 的启动路径上可靠可达。如果 TPM 被放到扩展板上,而扩展板又因为总线枚举顺序或者地址冲突没被初始化,启动度量链就会断掉。

这也是为什么现在 PC/104-Plus 主板几乎清一色把 TPM 焊在 CPU 底板上。在堆叠设计中,CPU 底板是整个系统的信任根发起者,扩展板是受信组件。它们之间的通信安全靠上层协议保证,比如驱动签名、配置校验。选型或者自己设计堆叠时,一定要先问清楚:TPM 在哪块板上,CPU 启动时能否在引导加载程序之前访问到它。

2.2 供电余量和宽温环境对芯片初始化的影响

TPM 是精密芯片,对供电和时序很敏感。PC/104-Plus 的多板堆叠有一个常见问题:总供电余量不足。系统启动瞬间,CPU、内存、扩展板同时上电,+5V 电压如果被拉低超过芯片允许范围,TPM 初始化就会失败。而且失败表现往往不是报错,而是系统里根本看不到 tpm0 设备。

我实测过一个案例:主板上焊了 TPM,dmesg 里完全没有 tpm_tis 相关输出,最后用示波器抓 +5V,发现启动瞬间跌到 4.6V,持续了约 200ms,刚好是 TPM 初始化需要的时间窗口。换了一个更大余量的电源模块之后问题消失。所以算供电余量时不要只按额定电流累加,至少留 1.5 到 2 倍余量,尤其有多块扩展板同时工作的系统。

宽温也是容易忽略的点。工业级 PC/104-Plus 板卡标称 -40℃ 到 +85℃,TPM 芯片在低温下初始化时间可能变长,如果固件里的 TPM 等待超时设置得太短,低温环境下会偶发找不到芯片。遇到这种问题,优先检查固件里有没有 TPM timeout 配置项,以及芯片是否选了工业级型号。

2.3 固件层最容易被忽略的三个开关

板载 TPM 不等于开箱即用,很多板卡出厂时固件默认没有把 TPM 完全暴露给操作系统。常见的有三个开关:

一是 TPM Device Selection。有些平台的固件同时支持板载独立 TPM 芯片和 CPU 内置的固件 TPM(Intel PTT 或 AMD fTPM),出厂可能默认指向 PTT/fTPM,导致板载芯片被忽略。需要进 BIOS 把它切到 Discrete TPM。

二是 TPM State。有些固件里 TPM 的启用状态分 Enabled 和 Disabled,默认是 Disabled。看起来芯片焊了,但 OS 完全感知不到。

三是 Firmware Update 通道。部分主板支持通过 BIOS 工具升级 TPM 固件,但如果固件版本和 TPM 芯片不匹配,升级可能导致密钥被清空。做这一步前务必备份恢复密钥,最好在产线上统一操作,不要在已经部署的设备上远程乱刷。

这三个开关听起来简单,但我在多个项目里都遇到过“BIOS 显示 TPM Enabled,系统里却找不到”的情况,十有八九是设备选择没切对。拿板后先把这三个地方过一遍。

3. 拿到板卡后的第一件事:验证 TPM 真在工作

3.1 UEFI 固件层确认状态

新板卡到手,别急着装系统。先开机进 UEFI 设置,在 Security / Trusted Computing 这类菜单下确认 TPM 状态。至少要看三样:TPM 状态是 Enabled、TPM 版本是 2.0、设备选择指向板载 Discrete TPM。

如果固件里显示 TPM 1.2,需要确认是否有切换选项。部分 BIOS 提供 Firmware TPM 和 Discrete TPM 的切换,也可能需要更新 BIOS 才能启用 2.0 模式。但这里有个建议:如果板子上焊的是 TPM 1.2 芯片,再怎么切换都不能变成 2.0,别被 BIOS 界面的选项误导。最好同时记下芯片厂商和固件版本,方便后续查兼容性。

3.2 Windows 下的极简验证链路

Windows 下验证最直接的方式是运行 tpm.msc,会弹出可信平台模块管理窗口。界面里会显示 TPM 是否就绪、版本号。如果提示“找不到兼容的 TPM”,按上一节说的去 BIOS 检查开关。

想要更精确的信息,用 PowerShell 跑 Get-Tpm,会输出一组状态字段。重点看这几个:

字段期望值说明
TpmPresentTrueTPM 芯片是否被系统识别
TpmReadyTrueTPM 是否可用
TpmEnabledTrue是否已启用
TpmManagedAuthLevelFull是否由系统管理所有者授权
TpmOwnerAuth非空所有者授权值(需要注意保护)

常见情况是 TpmPresent=True 但 TpmReady=False,多半是固件版本或驱动问题,先检查 BIOS 开关,再考虑更新驱动。

3.3 Linux 下的极简验证链路

Linux 下验证更透明,先看内核日志:

dmesg | grep -i tpm

正常会出现 tpm_tis 或 tpm_crb 设备初始化信息,以及 TPM 2.0 Device 固件版本。然后检查设备节点:

ls -l /sys/class/tpm/tpm0/

如果存在,说明内核已经识别。再装 tpm2-tools 查看能力集:

tpm2_getcap caps

输出的 TPM 2.0 版本、支持算法、PCR 数量一目了然。老版本系统只有 TPM 1.2 的话,用的工具是 trousers 的 tpm-tools,命令不太一样。建议新项目直接用 TPM 2.0 + tpm2-tools。

我习惯在板卡出厂测试脚本里加一段 TPM 自检,就这三条命令:有 dmesg 输出、设备节点存在、tpm2_getcap 能返回能力集。三项全过才放行出货。这样做之后,因为 TPM 虚焊或固件配置错误导致的现场返修少了很多。

4. 让 TPM 干正事:三个最值得落地的安全场景

4.1 Secure Boot 信任链与 PCR 度量

TPM 最核心的价值是参与建立安全启动信任链。UEFI Secure Boot 大家比较熟悉,它通过平台密钥(PK)、密钥交换密钥(KEK)、签名数据库(DB)确保只有经过签名的固件、引导加载程序和内核才能运行。Secure Boot 本身不依赖 TPM 也能工作,但配合 TPM 的 PCR 度量可以把信任链记录在硬件里,为后续的磁盘加密解锁、远程证明提供依据。

嵌入式 Linux 场景下,除了 UEFI Secure Boot,也可以采用 U-Boot verified boot 配合 TPM。启动过程中,U-Boot 计算内核镜像的哈希并扩写到 PCR0/PCR7,再由内核度量根文件系统。这样一来,任何组件的微小改变都会反映在 PCR 值里,下游的设备身份认证和密钥解锁都能引用这些值做判断。

实际部署时要注意:一旦启用 PCR 绑定,更新内核、grub 或者 U-Boot 后 PCR 值会变化,依赖旧 PCR 策略解锁的密钥会全部失效。更新固件前要规划好解密策略的重新封装流程,最好在测试环境验证一遍再上生产设备。

4.2 无人值守磁盘加密:BitLocker 与 LUKS 的 TPM 解锁

工控设备经常无人值守,开机不能要求人输密码。传统全盘加密方案在这种场景下很难用,TPM 的价值就体现出来了。

Windows 系统用 BitLocker,在 TPM 模式下,启动过程如果引导文件未被篡改,TPM 会自动释放卷密钥,系统正常启动;如果启动文件被改动,PCR 校验不过,TCG 会进入恢复模式,要求用户提供恢复密钥。这样就同时实现了“免人工输入”和“防启动篡改”。

Linux 更灵活,新版本系统可以用 systemd-cryptenroll 把 LUKS 密钥密封到 TPM 2.0。比如有一个加密分区 /dev/sda2,绑定操作很简单:

sudo systemd-cryptenroll --tpm2-device=auto /dev/sda2

重启后,只要系统引导链的 PCR 值符合策略,加密卷会自动解锁。如果哪天升级内核导致 PCR 变化,系统会提示输入密码走手动恢复路径,再用 systemd-cryptenroll 重新绑定一次即可。

不过这里有一个工程权衡:PCR 绑定越严格,安全性越高,但系统文件、内核、引导配置的任何变更都可能锁盘。对自动升级频繁的嵌入式设备,建议只绑定关键的 PCR 值,比如 PCR7(Secure Boot 状态)和 PCR0(固件),不要绑那种每次内核升级都会变的 PCR,避免固件升级后设备远程起不来。

4.3 设备身份与远程证明:让设备自证未篡改

TPM 还有一个企业级价值:远程证明。每颗 TPM 芯片出厂时都内置一个唯一的背书密钥 EK,和制造商签发的证书对应。出于隐私考虑,对外通信时一般用由 EK 派生的别名密钥 AK。运行时,设备可以读取 PCR 度量的当前值,用 AK 签名后发给验证服务器;服务器通过核对签名和 PCR 期望值,就能判断远端设备的固件、内核、引导组件是否被动过手脚。

这个机制放在工业物联网里很实用。比如一组分布在多个站点的边缘网关,运维平台定期发起远程证明请求,网关的 TPM 签名上报 PCR 值。一旦发现某个网关的 PCR 值和基线不一致,说明设备可能被恶意刷机或者引导组件被替换,平台可以自动隔离该设备,防止带病设备接入生产网络。

实现上,tpm2-tss 生态提供了完整的库和工具,代码层面通过 tss2 库调用 TPM 生成 AK、签名字节串、读取 PCR,不算复杂。真正复杂的是基线管理:设备的 PCR 早期度量值会随固件版本变化,需要把“硬件配置”和“软件版本”分开管理,建立 PCR 基线库。这块做不好,远程证明上线后会是告警轰炸,运维会直接关掉功能。

5. 现场排查经验:那些看起来像 TPM 故障的“假问题”

5.1 Windows 11 安装报 0xc1900200 的排查链路

搜索 TPM 相关热词时,出现频率最高的是 Windows 11 安装报错 0xc1900200,或者提示找不到兼容的 TPM。这个错误码的意思是当前设备不满足 Windows 11 的最低硬件要求,TPM 缺失或未启用是常见原因之一。

但我在实际项目里发现,很大比例不是“没有 TPM”,而是“没开对”。排查链路按这个顺序走:

  1. 进 BIOS,确认 TPM 状态为 Enabled,版本为 2.0。
  2. 确认设备选择不是 PTT/fTPM 而是 Discrete TPM(板载独立芯片),或者反过来,如果板子不支持独立 TPM,就确认固件 TPM 已启用。
  3. 确认 UEFI 模式和 Secure Boot 已打开,Win11 要求 UEFI + Secure Boot,纯 Legacy 模式装不上。
  4. 更新 BIOS 到厂家最新版本,有些老固件对 TPM 的支持不完整。
  5. 重新安装,如果还报 0xc1900200,用 tpm.msc 确认系统层是否识别到 TPM 2.0。

我不建议使用网上那种“跳过 TPM 检查”的方式去安装 Windows 11。且不说微软官方不支持,对工控项目来说,系统装完后续还要开 BitLocker、跑远程证明,TPM 功能没法用的话,前面的安全设计全部落空。

5.2 BIOS 里开着,系统却找不到 TPM

比“没有 TPM”更让人抓狂的是 BIOS 里明明显示 Enabled,进了系统却找不到设备。Windows 下 tpm.msc 报“找不到兼容的 TPM”,Linux 下 dmesg 里连 tpm_tis 的初始化日志都没有。

这类问题优先怀疑三个方向:ACPI 表、固件配置、资源冲突。PC/104-Plus 多板堆叠时,如果扩展板上的存储器或 IO 设备占用了 LPC/eSPI 相关的资源,TPM 可能无法被枚举。先做最小化验证:拔掉所有扩展板,只留 CPU 主板和内存,看 TPM 是否出现。最小系统里正常,就逐块插回扩展板,找到冲突源。

如果最小系统里也认不到,把 BIOS 恢复出厂默认再试一次,然后升级到最新固件。我遇到过一次,板卡出厂 BIOS 版本对某批次 TPM 芯片的 ACPI 表生成有 bug,升级后即恢复正常。这种问题没法通过 OS 层解决,只能找板厂要固件更新。

5.3 休眠唤醒、连续断电后 TPM 掉线

工控设备如果启用了休眠或待机,唤醒后偶尔会出现 TPM 设备消失的情况。dmesg 里通常能看到类似的超时或者命令响应失败记录。这大概率不是 TPM 芯片坏了,而是 LPC/eSPI 链路上的时序在休眠恢复流程中出了问题,属于平台固件或驱动层面的 bug。

处理建议是先更新 BIOS 到最新版本,再看内核或 Windows 驱动有没有针对该平台的补丁。如果更新后仍然偶发,就在系统层面做兜底:写一个开机自检脚本,发现 tpm0 不存在或者命令无法响应就告警,必要时自动重启。对电力、轨交这种不允许业务中断的设备,兜底策略比单纯指望修复固件更现实。

另外,PC/104-Plus 堆叠结构的物理接触也要检查。长期振动的设备,总线连接器可能出现微动磨损,导致 eSPI 信号质量下降。故障率高的时候,把板卡重新插拔一遍可能会有惊喜。

5.4 千万别手欠 Clear TPM

这个坑我踩过,代价很大。有一次远程给现场设备做调试,想重置 TPM 的所有者状态,直接在 TPM 管理工具里点了 Clear TPM。结果不仅清掉了所有者授权,还把密封在 TPM 里的磁盘加密密钥一并抹掉了。设备重启后,加密盘无法自动解锁,只能让现场同事人工输入恢复密钥。如果当时没有备份恢复密钥,整块盘的数据就彻底没了。

Clear TPM 会清除所有由 TPM 保护的密钥材料。使用 BitLocker、LUKS 或任何 TPM sealed 密钥的设备,操作前必须确认恢复密钥已备份,并且在设备本地可以访问。远程操作 Clear TPM 更是一个高风险动作,除非你有百分之百的把握和现场人员支持,否则绝对不要做。产线出厂时如果要 Clear,也需要在进入最终封装前执行,并且完成密钥重新封装。

另外提一句,TPM 的 PCR 值在每次启动时会重置重新度量,但被密封的密钥不会因此消失。只有执行 Clear 或者芯片内部状态被重置时才会失丢。真要调整策略,优先使用重新封装密钥的方式,而不是 Clear。

目前这些经验基本覆盖了 PC/104-Plus 板载 TPM 从选型、验证到部署的完整链路。我自己的体会是,板载 TPM 不是锦上添花的参数,而是现代嵌入式设备安全建设必要的起点。它解决的是“信任根”这个最底层的命题,后续无论是磁盘加密、安全启动还是远程证明,都建立在这颗小芯片之上。建议有条件的同行在板卡出厂测试阶段就把 TPM 自检加进流程,用 dmesg、设备节点、tpm2_getcap 三项检查把关,能挡住大量潜在的现场故障。最后再提醒一句:网上搜 TPM 会看到很多 token per minute 的内容,那是大模型吞吐量的统计口径,和本文讲的可信平台模块完全是两码事,检索资料时别被带偏了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询