这些年做嵌入式选型,我发现自己看数据手册的顺序变了。以前先看 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.2 | TPM 2.0 |
|---|---|---|
| 主要算法 | SHA-1、RSA | SHA-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,会输出一组状态字段。重点看这几个:
| 字段 | 期望值 | 说明 |
|---|---|---|
| TpmPresent | True | TPM 芯片是否被系统识别 |
| TpmReady | True | TPM 是否可用 |
| TpmEnabled | True | 是否已启用 |
| TpmManagedAuthLevel | Full | 是否由系统管理所有者授权 |
| 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”,而是“没开对”。排查链路按这个顺序走:
- 进 BIOS,确认 TPM 状态为 Enabled,版本为 2.0。
- 确认设备选择不是 PTT/fTPM 而是 Discrete TPM(板载独立芯片),或者反过来,如果板子不支持独立 TPM,就确认固件 TPM 已启用。
- 确认 UEFI 模式和 Secure Boot 已打开,Win11 要求 UEFI + Secure Boot,纯 Legacy 模式装不上。
- 更新 BIOS 到厂家最新版本,有些老固件对 TPM 的支持不完整。
- 重新安装,如果还报 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 的内容,那是大模型吞吐量的统计口径,和本文讲的可信平台模块完全是两码事,检索资料时别被带偏了。