ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PCIe/104单板机上的TPM 2.0实战与调优

PCIe/104单板机上的TPM 2.0实战与调优 一块PCIe/104规格的单板电脑型号后缀带“OneBank”板子上多了一颗TPM-2.0安全芯片。这配置放在五年前算是锦上添花放在现在基本属于刚需。工控、轨道交通、医疗器械、边缘网关凡是设备要联网、要控权、要防拆解招标文件里十有八九会写一句“支持TPM 2.0”。我最近正好在调一款类似的板子从选型、固件配置到BitLocker和tpm2-tools实战都过了一遍踩了几个不大不小的坑。这篇就把整条链路梳理清楚给准备接触这类单板机的人一个完整参考。先说清楚一个容易混淆的点SBC在这里是Single Board Computer单板计算机跟网上某些新闻里的缩写不是一回事。咱们这篇只聊硬件和系统安全不扯别的。下面内容主要围绕三件事展开PCIe/104 OneBank规格到底怎么理解、TPM-2.0在嵌入式单板机上怎么落地、以及真正调试时你会遇到哪些实际问题。1. 先从这三个词说起PCIe/104、OneBank、SBC1.1 PCIe/104堆叠式工控主板的老牌标准PCIe/104是PC/104家族里的PCI Express版本尺寸依然是90mm×96mm比一张名片大不了多少。这个尺寸玩工控的人应该都很熟它最大的特点就是通过板边连接器层层堆叠不需要背板不需要机箱内的大底板几十块功能板像积木一样叠起来靠四角的安装孔固定。从PC/104、PCI/104到PCIe/104总线从ISA演进到PCI再到PCIe但是“紧凑、可靠、抗振动、支持宽温”这几个核心特性一直没变。传统服务器和桌面机靠PCIe插槽扩展在这个尺寸下根本塞不下PCIe/104把PCIe链路直接引到板对板连接器上带宽和延迟都有保证。在军工、车载、轨交这些现场设备要长期在高低温、振动、电磁干扰环境里跑插卡式结构最怕接触不良和松动。PCIe/104的堆叠结构加锁紧螺钉比金手指插槽靠谱得多。所以哪怕现在有COM Express、Qseven这类更小的模块化方案PCIe/104在特定领域依然活得很好。1.2 OneBank是连接器规格不是内存bankOneBank这个词在PCIe/104语境里指的是连接器的物理分组方式。PCIe/104规范把信号引脚分成若干个bankOneBank就是只提供一组连接器通常包含1路PCIe x1链路、USB、SATA、SMBus等基础信号。相比之下TwoBank或者更完整的规格会额外提供PCIe x4/x16等更宽的高速链路当然占用的板边空间也更大。很多厂商用OneBank来命名产品线意在表明这款SBC是基础扩展规格适合I/O密度不高、但对可靠性要求高的场景。实际选型时要注意别把OneBank和内存单通道混为一谈。虽然不少采用OneBank连接器的板子出于功耗和板面积考虑确实只设计了一条SODIMM插槽、单通道DDR4内存但这两个概念一个管扩展总线一个管内存系统需要分开看。我在拿到这款板子时先翻了硬件手册里的结构框图看到连接器引脚定义标着“OneBank Type 1”内存部分写的是“Single Channel DDR4 SODIMM”才彻底确认这两个信息是独立的。提前说清楚这点可以帮你少走不少弯路尤其是第一次接触这类规格的工程师很容易在评审会上被问住。1.3 这种SBC适合什么项目OneBank这种基础扩展规格的SBC定位很明确核心运算、基础I/O、安全启动不追求大扩展。适合的场景包括边缘网关和协议转换设备需要多路串口、网口同时要求本地数据加密存储。医疗仪器主控板对网络安全和数据完整性要求高TPM 2.0几乎是标配。轨交和车载信息终端宽温、抗振要求严苛设备数量大需要远程证明平台可信状态。国防和特种装备要求软硬件供应链可追溯、启动链路可度量、密钥必须由硬件保护。如果你在做的项目需要一堆PCIe x8/x16高速采集卡那OneBank的扩展能力肯定不够应该去看TwoBank甚至更完整规格的板子。反过来如果你只需要稳定的串口、网口、GPIO和可信启动OneBank这种结构反而更紧凑、更省电、故障点更少。2. TPM-2.0为什么突然成了单板机的标配2.1 从TPM 1.2到2.0变化不只是版本号TPM是Trusted Platform Module的缩写本质上是一颗独立的密码协处理器负责密钥生成、密钥存储、平台完整性度量、远程证明这些安全操作。TPM 2.0是可信计算组TCG发布的第二代规范2016年被采纳为ISO/IEC 11889国际标准和TPM 1.2相比改动是革命性的。TPM 1.2主要面向PC算法几乎绑定RSA和SHA-1架构偏死板。TPM 2.0在算法上全面放开支持RSA、ECCNIST P-256/P-384等、SHA-1/SHA-256/SHA-384甚至AES和HMAC密码学上更现代。更重要的是它引入了一套统一的密钥层次和对象模型同一个TPM可以同时为多个应用提供服务互不干扰。从嵌入式开发角度看TPM 2.0最大的价值是它把“信任根”真正下沉到了硬件。固件、Bootloader、内核、关键系统文件每一层的哈希值都可以被度量并记录到TPM的PCR寄存器里。只要启动链路的任何一个环节被改过PCR值和预期不一致系统就可以拒绝继续启动或者拒绝解封密钥。这种信任链机制是纯软件方案替代不了的。2.2 在单板机上TPM 2.0具体能干这些事从实际应用角度TPM 2.0在SBC上主要有四类用途第一是启动完整性验证。UEFI安全启动Secure Boot配合TPM在每次开机时把固件、Option ROM、引导程序的度量值记录到PCR确保没有跑飞或被篡改。第二是密钥保护。BitLocker、LUKS这类全盘加密工具可以把卷密钥密封到TPM里只有在PCR状态正常且平台状态可信时才能解锁。这样即使硬盘被拆走没有TPM里的密钥也读不出数据。第三是设备身份认证。TPM内部出厂时预置了背书密钥EKEndorsement Key对应的EK证书可用于证明“这颗TPM是正品、这个平台是可信平台”。这在设备入网认证、License授权、远程管理场景里特别有用。第四是远程证明。设备可以通过AIKAttestation Identity Key对PCR值做签名把签名结果发给远程服务器服务器据此判断该设备当前是否处于可信状态从而决定是否允许接入内网或下发敏感配置。对单板机来说前两类用得最多后两类在网关和物联网设备上越来越常见。2.3 fTPM和dTPM怎么选TPM有两种落地方式。dTPM是独立安全芯片通过SPI或I2C总线跟主控连接物理隔离性好抗攻击能力强fTPM则是把TPM逻辑实现在CPU内部的固件或安全处理器里不占额外PCB面积。大多数嵌入式SBC用的是dTPM原因很简单工业场景对供应链安全和物理攻击防护更敏感独立芯片可以做到防拆、防侧信道攻击。而且fTPM依赖CPU厂商实现不同SoC之间的行为差异比较大对BSP适配要求高。如果是dTPM固件和驱动相对标准化常见芯片如英飞凌SLB 9670系列、Nuvoton NPCT75x系列都有成熟的支持。但dTPM也有一个麻烦它需要占用一个SPI或I2C控制器PCB布局时还要考虑信号完整性和干扰隔离。另外dTPM芯片和主控CPU一般不是同一家厂商启动时固件要先初始化TPM再执行安全策略这个先后顺序在BSP里要理清楚。3. 安全启动链路和硬件设计的关键细节3.1 TPM 2.0的物理接口SPI、I2C还是LPCTPM 2.0规范定义了SPI、I2C、LPC三种接口速率和适用场景差别很大。SPI是目前的主流选择典型工作频率20MHz性能最好命令响应快适合对启动时间有要求的设备。但SPI接口的引脚功能是复用的固件里必须正确配置SPI控制器复用关系否则会跟Flash、传感器等设备冲突。I2C接口速率低但只需要两根线适合对性能要求不高的场景。一些追求极简设计的SBC会采用I2C TPM代价是做平台状态度量的时间会变长。LPC接口是PC时代的产物在新的嵌入式平台里基本被SPI取代了。选型时建议优先看SPI接口的dTPM。实测下来SPI TPM做一次完整启动度量PCR0-PCR7通常只要几百毫秒I2C可能会慢上一倍不止对开机时间敏感的医疗或车载设备来说差距很明显。3.2 PCR、密钥层次和Seal机制搞清楚这三个概念PCRPlatform Configuration Register是TPM内部的一组平台配置寄存器一共24个编号0-23用来记录平台启动过程中各阶段代码的度量值。每个PCR只能通过扩展操作更新新的哈希值等于原值和输入值拼接后再做一次哈希这种方式保证了历史度量的完整性无法被伪造。常用的PCR分配大致是PCR0存固件代码度量PCR1存固件数据配置PCR2/3存Option ROMPCR5存Option ROM数据和启动管理器配置PCR7存Secure Boot策略PCR14存第三方引导加载程序策略。嵌入式Linux平台上U-Boot、GRUB、内核和initramfs的度量值也会被记录到固定PCR。密钥层次是TPM 2.0的另一个核心。TPM内部有四个层次平台层Platform、背书层Endorsement、存储层Storage、空层Null。每个层次都有自己的Primary Seed由种子派生主密钥。存储层主密钥对应的就是SRKStorage Root Key负责保护应用密钥。密钥不能直接导出只能在TPM内部使用所以就算攻击者通过总线嗅探也拿不到私钥明文。Seal密封机制则是把数据和一组PCR值绑定。只有当前PCR值与密封时一致TPM才允许解封数据。BitLocker用的就是这个原理卷密钥被密封到TPM里启动时如果发现PCR被改过密钥就不给解封系统直接进恢复模式。3.3 固件里常见的TPM配置项在实际SBC上UEFI/BIOS固件的TPM配置一般集中在Security或Trusted Computing菜单里常见配置项有TPM Device Selection选择启用dTPM还是fTPM或者自动检测。TPM Interface Type选择SPI或I2C必须和硬件连接一致。PCR Bank Configuration选择启用SHA-1、SHA-256银行有些板子还支持SM3/SM4。Secure Boot Policy是否启用Secure Boot以及证书管理模式。TPM State是否开启、是否禁用、是否清除Clear。我第一次调这块板子时默认固件里TPM Device Selection是“Auto”但SPI总线上同时挂了一颗BIOS Flash和一颗TPMAuto模式下固件优先识别到了FlashTPM一直枚举不出来。后来手动改成TPM优先再重启tpm2-tools就能正常访问了。注意在固件里执行TPM Clear操作会清除所有NV Index、SRK和Sealed数据BitLocker分区需要先挂起保护再操作否则恢复密钥会失效。这个坑下面细说。4. 从零把TPM-2.0用起来Windows和Linux双平台实操4.1 上电后先确认TPM是否正常工作拿到板子先别急着开发业务逻辑第一步是确认TPM有没有被固件正确识别。Windows系统下最简单的方式是运行tpm.msc打开TPM管理控制台在“TPM制造商信息”里能看到芯片的厂商、版本和状态。命令行的方式更直接PowerShell里执行Get-Tpm返回结果里的TpmPresent、TpmReady、TpmEnabled都要是TrueTpmActivated也是True才说明完全正常。如果TpmPresent是False大概率是固件里没启用或者SPI枚举有问题。Linux系统下先检查内核是否识别了TPM设备ls /dev/tpm*输出通常有/dev/tpm0和/dev/tpmrm0tpmrm0是内核管理的资源管理器设备有它说明驱动加载成功。然后安装tpm2-tools工具集Debian/Ubuntu系是sudo apt install tpm2-tools之后用tpm2_getcap查看能力tpm2_getcap properties-fixed能正常返回一堆厂商属性和算法列表就说明TPM已经被完整枚举出来了。4.2 BitLocker绑定TPM的完整过程在Windows平台BitLocker是TPM最典型的使用场景。在支持的Windows版本上开放BitLocker功能然后管理员权限执行Enable-BitLocker -MountPoint C: -UsedSpaceOnly -EncryptionMethod XtsAes256 -TpmProtector这会把C盘的卷密钥密封到TPM里。后续开机时Windows引导管理器会在启动早期向TPM发送PCR值如果PCR值匹配TPM就解封卷密钥系统自动解锁。如果PCR不匹配比如固件升级、Secure Boot策略改动、或者引导文件被修改TPM会拒绝解封系统进入BitLocker恢复模式要求输入48位恢复密钥。强烈建议在开启BitLocker后立即备份恢复密钥manage-bde -protectors -get C:把48位数字恢复密钥离线保存到安全地方别放在同一块硬盘里。实测中遇到最多的情况是BIOS升级后BitLocker不认了。这不是板子坏了而是PCR0值变了TPM检测到固件身份变化出于安全考虑拒绝解封。只要你有恢复密钥进入恢复模式输进去照样能开机然后系统会重新验证并更新PCR绑定。4.3 Linux下用tpm2-tools完成一次Seal/UnsealLinux平台不依赖BitLocker的机制可以直接用tpm2-tools手动体验TPM的密封流程。先创建存储层主密钥SRKtpm2_createprimary -C e -G ecc -c primary.ctx这条命令在背书层e下创建ECC类型的主密钥生成的primary.ctx是上下文文件标识后续操作依赖的密钥对象。然后创建一对密封密钥把一段秘密数据密封到当前PCR状态下echo sbc-secret-data secret.dat tpm2_create -C primary.ctx -i secret.dat -u seal.pub -r seal.priv -L sha256:0,7 tpm2_load -C primary.ctx -u seal.pub -r seal.priv -c seal.ctx tpm2_unseal -c seal.ctx这里的-L参数指定了策略PCR集合例子中用了SHA-256银行的PCR0和PCR7。如果PCR0或PCR7当前的值和密封时不一致最后一步tpm2_unseal会报POLICY_PCR校验失败。这个实验对理解TPM很有帮助你可以试着改一下Secure Boot策略重启后再跑一次unseal大概率会失败这正是TPM想要的效果平台状态不可信时机密不给出来。4.4 产品化时的EK证书和工厂初始化如果这块SBC是准备量产发货的TPM这块不能只用默认状态。出厂前至少要做三件事第一读取EK公钥和EK证书。EK证书由TPM芯片厂商预置用来证明TPM真实身份。Linux下可以用tpm2_createek读取tpm2_createek -c ek.ctx -G rsa -u ek.pub tpm2_readpublic -c ek.ctx -f pem -o ek.pem将EK证书或公钥写入设备的配置存储区后续设备注册时可以用它建立设备唯一身份。第二清除TPM的出厂默认状态重新初始化存储层。这一步用tpm2_clear注意这会清掉所有NV Index、SRK以及已经密封的数据需要在初始化流程里专门做不能在运行态随便执行。第三定义自己的NV Index来存设备证书、序列号等数据tpm2_nvdefine -C o -s 32 -a ownerread|ownerwrite|policywrite 0x1500001 tpm2_nvwrite -C o 0x1500001 -i device-info.bin tpm2_nvread -C o 0x1500001NV Index的编号规则、访问权限和认证策略要提前规划好避免量产后发现权限设得太死导致远程升级或设备注册流程没法写数据。5. 常见翻车现场和排查心得5.1 固件升级后BitLocker疯狂弹恢复密钥这是TPM相关问题的No.1。现象是板子固件升级后第一次启动进入BitLocker恢复界面输入恢复密钥才能进系统。原因很明确固件内容变化导致PCR0度量值变化TPM判断平台状态不可信拒绝解封卷密钥。这不是故障是安全机制在正常工作。处理办法提前挂起BitLocker保护再升级固件。Windows下管理员执行Suspend-BitLocker -MountPoint C: -RebootCount 1之后按重启次数恢复保护升级完成后再用Resume-BitLocker -MountPoint C:如果已经进入恢复模式直接输恢复密钥即可。恢复后系统会把新PCR值作为基准重新绑定后续启动就正常了。5.2 SPI TPM偶尔读不到启动时有时无我调过的板子里这个问题不算少见。现象是量产后一部分板子/Dev/tpm0不存在运行lspci或dmesg看不到SPI TPM设备换一块板子又正常。排查思路按优先级来检查固件里的TPM Device Selection是否从Auto改成了具体类型。检查SPI TPM片选信号有没有和后端Flash冲突。TPM和SPI Flash经常共享SPI控制器如果固件里CSChip Select分配错设备根本不会被枚举。检查硬件焊接和SPI总线上拉电阻。TPM的MISO、MOSI、CLK信号需要合理的上下拉部分设计会在量产时省略或虚焊导致信号质量边缘化。用示波器看SPI Clock和CS时序确认固件初始化阶段有没有对TPM发起过有效的访问。这个问题最耗时间但一般来说固件配置错误的概率最大建议先静态检查固件再动示波器。5.3 PCR值总是不稳定反复变化如果每次启动PCR0/PCR7都不一致先别怀疑TPM坏了大概率是启动过程中引入了可变因素。常见原因包括启动菜单顺序变化、外设Option ROM枚举顺序不固定、Secure Boot证书被更新过、以及时间戳被度量进了某个PCR。嵌入式Linux平台上还要注意U-Boot环境变量里bootargs不一致导致内核度量值变化。解决办法是固定启动参数、固定引导设备顺序让系统的每次启动路径完全一致。5.4 选型时别只看“支持TPM-2.0”三个字很多厂商把“Support TPM 2.0”当宣传卖点但实际交付形态差别很大。选型时建议问清楚几个问题TPM芯片是dTPM还是fTPM如果是dTPM具体型号和供货周期如何TPM接口是SPI还是I2C最大速率多少固件里能否配置PCR Bank算法EK证书是否预置如果预置证书格式是标准X.509还是厂商私有格式主控SoC对TPM的支持度如何BSP里是否集成了tpm2-tss相关驱动和工具宽温范围内TPM芯片的最大工作温度是否覆盖整板工作温度很多消费级TPM芯片只支持0-70℃工业级需要-40-85℃。这几个问题问下来能筛掉大部分只会贴标签的产品。5.5 功耗和启动时间要一起算TPM本身功耗不高SPI模式下典型电流只有几毫安但整个安全启动链路对系统功耗和启动时间的影响不能忽略。启用PCR度量和Secure Boot后每次启动要额外执行固件哈希计算、度量值扩展、策略校验实测启动时间通常增加200-500ms。对电池供电的便携设备这500ms意味着多出一段不允许休眠的窗口期对快速切换倒车画面的轨交设备增加了开机黑屏时间。评估项目时要把这块开销算进去别等量产后被测试组卡指标。带着个人经验来说这款PCIe/104 OneBank SBC的调试经历我最大的收获是TPM 2.0不是“焊一颗芯片就完事”的功能它改变的是从固件到应用层的整个信任模型。板子刚到手时我自己也习惯性地只把它当成一颗普通的安全芯片先看驱动能不能跑再看命令能不能通。但真正把它用起来之后才发现PCR、密钥层次、远程证明这些概念才是难点而它们恰恰决定了一台嵌入式设备能不能在生产环境中承担起防篡改和身份认证的职责。如果你也在评估这类带TPM的SBC最后一句话安全功能一定要在设计阶段就融入整机架构硬件定型之后再回头补代价基本都是几何级上升。现在你能在板卡上看到TPM-2.0这几个字本身就是好事但更重要的是把它用对。
返回列表