ARTICLE DETAIL

资讯详情

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

OPTIGA TPM实战:从信任根到远程证明的物联网安全落地指南

OPTIGA TPM实战:从信任根到远程证明的物联网安全落地指南 这几年做互联设备的安全方案我最大的感受是很多团队的安全投入还停留在“加了 HTTPS 就算安全”的阶段可真到了设备被拖进僵尸网络、固件被逆向篡改、密钥被连根拔起的时候才发现软件层面的防线在物理接触和供应链攻击面前有多脆。OPTIGA 这个系列的 Trusted Platform ModuleTPM是我在多个量产项目里反复对比后最终稳定采用的方案这篇文章不打算写得太像产品手册而是从信任根的设计逻辑、实际集成流程到现场踩过的坑完整梳理一遍给正在做网联设备安全的团队一个可以直接参考的路径。1. 互联设备的信任危机从“能用”到“可信”之间的那道坎先说一个反直觉的结论很多互联设备根本不缺加密能力而是缺一个“可信的起点”。普通的 MCU 或应用处理器里跑的 AES、RSA 这些密码算法库当然能做加密通信但这些密钥存在哪里绝大多数情况是存在 Flash 或片上 OTP 里。只要攻击者拿到硬件用 SPI Flash 读取器或者芯片开盖的手段就能把二进制固件整个 dump 出来逆向找到密钥位置甚至直接 patch 掉安全校验逻辑。软件壳和混淆只能拖慢节奏挡不住决心够大的对手。互联设备信任危机的另一个来源是供应链。设备出厂前固件被谁签的名OTA 升级包校验用的公钥是否可信产线上的烧录工具是否会被污染这些问题如果不落实到硬件信任根上最后都会成为攻击面。尤其是现在很多设备走的是“网关 子设备”的架构一个弱口令的摄像头不仅危害自身还可能成为打入家庭内网或工业现场的跳板。有人在安全社区做过统计大量 IoT 僵尸网络的感染路径都是通过弱口令、已知 CVE 和明文固件漏洞完成的而这些恰恰是 TPM 这类硬件信任根能解决的侧面——但前提是你真的把“信任”这件事做对了。OPI TGA 的产品线从早期的 SLB 9635 到现在的 OPTIGA TPM SLB 9670核心思路一直没变通过独立的硬件安全芯片把密钥生成、存储、签名、派生这些敏感操作从主处理器里隔离出来。即便主控制器被完全攻破、固件被替换攻击者也无法从 TPM 内部导出私钥。这种方案和纯软件 TPM比如用固件模拟的 fTPM最大的区别在于它有一个独立的物理边界。fTPM 跑在主 CPU 的信任域里如果 CPU 的漏洞能够实现任意代码执行fTPM 的密钥一样会被拖走而 OPTIGA 这些独立安全芯片有自己的 CPU、存储和总线隔离攻击路径完全不同。不过要澄清一件事TPM 不是万能的。它解决的是“信任根”和“密钥保护”的问题不能替代应用层的输入校验、访问控制和隐私合规。很多客户以为装一颗 TPM 就等于安全了其实 TPM 只是给你提供了一个更可靠的锚点链路上的每一环还需要自己设计好。理解这个边界后面用起来才不会走偏。1.1 常见互联设备威胁模型与 TPM 的对症下药把互联设备的攻击面拆开看大致能分成这么几类固件逆向与篡改通过 UART、JTAG、SPI 或者软件漏洞读取/修改 Flash 内容。密钥窃取从文件系统、Flash、内存中导出用于签名或加密的私钥。设备身份伪造复制一台合法设备的身份信息接入平台仿冒操作。回滚攻击将设备固件回滚到带已知漏洞的旧版本。物理攻击通过电压毛刺、电磁注入、探针等方式干扰芯片运行。这五类威胁TPM 能对前面四类起到显著的缓解作用对第五类物理攻击则要看具体攻击者的能力和成本。OPTIGA TPM 在物理防护上做了不少设计包括主动屏蔽层、电压温度检测、随机数发生器的物理熵源等但如果是国家级攻击者带着电子显微镜来开盖任何商用安全芯片都不敢说绝对防御。选型时要把威胁模型写清楚如果是普通民品TPM 的物理防护绰绰有余如果是对抗高等级物理攻击的场景可能还需要考虑更高防护等级的安全元件。1.2 TPM 不是一颗“加密芯片”而是一套信任体系很多人第一次接触 TPM误以为它就是一颗“能算 AES 的加密芯片”其实它的核心价值在于 PCRPlatform Configuration Register度量、密封存储和远程证明这三个机制。PCR 是一组只能扩展Extend不能直接写的寄存器每次扩展的操作本质上是 hash 拼接新值新 PCR HASH(旧 PCR || 新度量值)。这意味着 PCR 的最终值反映的是从启动到当前所有被度量组件的完整链条。攻击者如果想篡改某个启动阶段的代码PCR 值就会和预期不一致后续依赖这些 PCR 值的密封对象Sealed Object就无法解开。密封存储是 TPM 的独占特性你可以把一个密钥或数据“封印”在一组 PCR 值下只有当当前 PCR 状态符合封印时的状态TPM 才允许解封。这样固件只要被改动过哪怕是极小的一处解密密钥都无法被释放出来。这个机制用在磁盘加密比如 BitLocker上已经有了很成熟的应用在互联设备上可以同理保护配置参数、证书私钥和业务敏感数据。远程证明则是让设备向服务器证明“我是谁我的运行状态是否可信”。设备用 TPM 里的 AKAttestation Key证明密钥对 PCR 值签名服务器拿到签名后校验 AK 证书链和 PCR 期望值从而判断设备是否处于可信状态。这三个机制合在一起才构成一套完整的信任体系。理解了这个体系再去读 OPTIGA 的数据手册和 API 文档很多设计都能对号入座。否则你只会把 TPM 当成一个普通的存储芯片白白浪费了它的核心能力。2. 拆开 OPTIGA TPM信任根、安全元件与密钥的生命周期管理说回 OPTIGA 这一系列本身。英飞凌的 OPTIGA TPM 是目前市面上应用非常广泛的独立 TPM 2.0 芯片方案之一不管是主板上的 dTPM、物联网模组里贴片的 TPM还是车规级应用都能看到它的身影。从产品定位上看OPTIGA TPM SLB 9670 是 TPM 2.0 规范的实现通过 LPC 或 I2C 接口与主控通信。对互联设备来说I2C 接口版本更常用因为它线少、功耗低、模组尺寸小特别适合路由器、网关、智能家居中枢这类设备。它的内部结构大致是一个 16 位的专用安全 CPU基于 8051 内核深度改造一组防篡改存储存放密钥和证书一个真随机数发生器TRNG以及各种密码引擎RSA、ECC、AES、SHA 等外加完整的 TPM 2.0 命令栈。2.1 为什么需要独立 CPU 和独立存储很多工程师会问主控芯片里不是也有安全区比如 TrustZone吗为什么还要外挂一颗 TPM答案在于信任边界。TrustZone 把 CPU 世界分成了安全世界和普通世界但如果主控本身存在硬件漏洞或者安全世界的代码实现有缺陷攻击者还是有机会突破隔离。更何况很多设备选用的低成本 MCU 根本没有 TrustZone 能力。独立 TPM 的好处是它的 CPU、存储、密码引擎都在一个独立的物理封装内主控对它只有通过标准命令接口的访问权。它不信任主控也不会把任何私钥明文的放出芯片外部。哪怕主控已经被完全控制攻击者能做的也只是调用 TPM 的合法功能而无法篡改 TPM 内部的策略。这个“最小信任面”的设计正是 TPM 体系能成为行业标准的原因。2.2 密钥层级EK、SRK、AK 和普通密钥谁管谁TPM 2.0 的密钥体系设计得比较细不搞清楚层级关系后面用起来很容易混乱。EKEndorsement Key背书密钥在 TPM 出厂时生成的唯一身份密钥私钥永远不离开 TPM对应的证书由 TPM 厂商签发用来证明“这是一颗真实合法的 TPM 芯片”。SRKStorage Root Key存储根密钥TPM 所有者Owner建立的根密钥用于加密保护 TPM 内部派生出的其他密钥对象。所有会话密钥的保密性最终都锚定在 SRK 上。AKAttestation Key证明密钥专门用于远程证明签名可以生成多把每把 AK 可以与不同的应用关联保护设备端和平台端的隐私。普通密钥Signing Key / Decryption Key用于业务数据的签名和加密受 SRK 或指定父密钥保护可以按需生成和淘汰。这个层级设计背后的逻辑是职责分离。EK 只用于证明 TPM 自己的合法性不参与业务签名避免设备身份被关联追踪AK 可以随时更换即使某个平台端泄露了 AK也不会影响底层的存储密钥树业务密钥则可以灵活地按应用、按租户隔离。还有一点TPM 2.0 里密钥可以作为对象Object被“导入/导出”但私钥部分在导出时会被加密包裹所以实际应用中“密钥永不落盘明文”仍然成立。2.3 OPTIGA 与普通 TPM 模块的差异在哪市面上也有其他家的 TPM 2.0 芯片或模块可选但 OPTIGA 有几个点在实际项目里很加分。全系列符合 Common CriteriaCCEAL4 认证芯片的研发过程和实现可信度有背书。提供完善的芯片端到端生命周期管理工具包括个人的个人化工具、产线烧录方案和证书管理产品化程度高。在汽车领域有 AEC-Q100 的车规版本可以用在车载网关、T-Box 等场景这是很多通用 TPM 模块给不了的。生态支持好Linux 内核的 tpm_tis_i2c 驱动、tpm2-tools、tpm2-tss 软件栈对 OPTIGA 的适配很成熟调通速度快。当然选型还得结合成本、功耗、采购渠道和主控接口来权衡。OPTIGA 的 I2C 版本在中小批量下的单价大概是几十元人民币级别相比一颗主控芯片的成本占比不高但它换来的是整个安全体系的信任锚点这笔账在安全要求高的设备上很容易算清楚。3. 把 TPM 用起来从硬件接线到远程证明链路的完整落地流程这部分我直接按照实际项目的推进顺序写从硬件、驱动、软件栈到证明链路每个环节都会给到能上手的细节。需要说明的是以下步骤是基于我接触过的多个 OPTIGA TPM 项目的通用流程具体芯片型号不同引脚定义和寄存器映射会有细微差别但整体方法论是一致的。3.1 硬件层I2C 接线的几个关键注意点以 OPTIGA TPM SLB 9670VQ2.0 为例它是 QFN-32 封装I2C 接口支持标准模式100 kHz和快速模式400 kHz。接线本身不复杂VCC、GND、SDA、SCL外加中断输出引脚IRQ和复位引脚RESET。但在实际打板时有几个细节很关键。TPM 的 I2C 地址是固定的默认 0x2E不像普通传感器可以改地址因此一条 I2C 总线上不能同时挂两个同型号 TPM。另外I2C 上拉电阻的选择要参考芯片数据手册的建议值阻值过大会导致信号上升沿变慢通信不稳定阻值过小则功耗偏高。我见过一块板子因为选了 10kΩ 上拉在低温环境下 TPM 偶发通信失败后来换 4.7kΩ 才稳定。RESET 引脚不能直接接死推荐用一个 GPIO 控制以便在系统休眠唤醒后重新初始化 TPM。IRQ 引脚可以用来接收 TPM 的命令完成通知如果主控的 GPIO 资源紧张也可以通过轮询状态寄存器的方式工作只是吞吐量低一点。3.2 Linux 内核与 tpm2-tss 软件栈的搭建现在的 Linux 内核5.x 之后对 TPM 2.0 的支持已经非常完善。驱动层面OPTIGA 的 I2C TPM 走的是 tpm_tis_i2c 驱动有些老内核里叫 tpm_i2c_infineon配置设备树后就能识别。设备树片段大致如下i2c2 { status okay; tpm2e { compatible infineon,slb9670; reg 0x2e; interrupt-parent gpio1; interrupts 13 IRQ_TYPE_EDGE_FALLING; }; };注意 compatible 字符串要写对内核匹配驱动时按它来找。如果用的是比较老的内核可能需要 patch 或确认驱动里有没有包含对应型号。设备树配好后启动时应该能在 dmesg 里看到类似 tpm tpm0: A TPM error (256) occurred attempting to read a pcr value 这样的输出这说明驱动已经正确找到了 TPM。接下来安装用户态软件栈。Debian/Ubuntu 系通常通过 tpm2-tss、tpm2-abrmd、tpm2-tools 三个软件包来提供完整功能tpm2-tss 是系统库实现了 TCG TSS 标准tpm2-abrmd 是资源管理守护进程负责 TPM 命令的并发访问和对象管理tpm2-tools 则是一组命令行工具调试和集成都很方便。sudo apt install tpm2-tools tpm2-abrmd libtss2-dev sudo systemctl enable --now tpm2-abrmd.service安装完成后可以用 tpm2_getrandom 测试基本通信tpm2_getrandom 16如果返回一串随机字节说明 TPM 基础链路已经通了。下一步我用 tpm2_createek 和 tpm2_createak 建立背书密钥和验证身份密钥。这里有个细节TPM 2.0 的 EK 在出厂时就预置了模板可以通过 tpm2_createek -c 0x81010001 把 EK 持久化到固定的 Handle方便后续引用。AK 的创建则建议用tpm2_createak -C 0x81010001 -c ak.ctx -u ak.pub生成然后把 AK 的公钥部分导出用于注册到平台服务端。3.3 度量启动与 PCR 扩展可信启动链路的关键我在这里展开讲一下“可信启动”的实际操作。互联设备如果用的是 U-Boot Linux 的组合可以对从 Bootloader 到内核再到根文件系统的每个启动阶段做度量把度量值扩展进 PCR。实现方式上U-Boot 自带 tpm 命令可以在加载内核镜像前对镜像文件做 PCR 扩展tpm2 pcr_extend 4 sha256:$(sha256sum kernel.itb)这样做的问题是如果只做度量而不做验证攻击者依然能改成加载一个任意镜像只不过 PCR 值会变得不同。所以真正安全的做法是“度量 密封/验证”配合把根文件系统的解密密钥用 PCR 值密封起来或者让平台服务端校验 PCR 值后再下发业务密钥。在 OPTIGA TPM 上做密封操作的典型命令是 tpm2_create 加-Lpolicy 或 PCR 选择参数然后在需要解开时用 tpm2_unseal。实际项目中我习惯把“是否允许解密敏感配置”和“PCR 集合是否匹配”绑定这样即使攻击者拿到了加密的存储介质在没有正确 PCR 状态的情况下也无法解开。另外一个容易忽略的点crypto 子系统里使用的 random pool seed也可以在启动早期用 TPM 的 TRNG 来补充熵。Linux 内核的add_early_randomness逻辑会自动使用 TPM 字节作为熵源之一但在嵌入式中需要确认 TPM 驱动注册到了合适的时机否则某些随机数依赖场景如 TLS 会话密钥生成可能因为熵不足而卡住或变慢。3.4 远程证明让服务器确认设备当前状态远程证明的链路做完整比较长但原理可以用一个最小实现说明。设备端先创建 AK拿到 AK 公钥和证书。与平台服务器建立会话后服务器下发一个随机 Nonce设备用 tpm2_quote 命令基于当前 PCR 值做签名tpm2_quote -c ak.ctx -l sha256:0,2,4 -m quote.msg -s quote.sig -o quote.pcr然后把 quote.msg、quote.sig、quote.pcr 以及 AK 公钥一起发给服务器。服务器要做三步验证用 AK 公钥验证 quote.sig 确实是本设备签的校验 quote.msg 中携带的 Nonce 和本次会话一致防止重放攻击比对 quote.pcr 中携带的 PCR 值是否等于平台期望的白名单值。这三步走完服务器的信任链就建立起来了。实际部署里还要加上 AK 证书链校验以确认这把 AK 来自一颗合法的 OPTIGA TPM。证书链可以走厂商签发的 EK 证书派生 AK 证书也可以由平台自定义签发灵活性还是比较大的。4. 现场踩坑固件更新、平台注册与 NV 索引冲突的真实教训这套方案看起来清晰但真到量产和现场维护阶段问题往往出在那些“照文档做应该没问题”的地方。我挑几个印象最深的坑展开说说。4.1 坑一固件升级把 PCR 值“升级没了”第一次做可信启动时我把 PCR 白名单写死在了平台服务端。设备出厂时的固件版本是 v1.0PCR 度量值是 A后来 OTA 升级到 v1.1固件代码变了对应的镜像 hash 也变了PCR 值变成了 B。结果所有升级后的设备在远程证明时全部被服务器判定为“不可信”业务直接被切断。这个问题的根因不是 TPM 工作异常而是度量策略没有考虑版本管理。解决思路有两种一是把版本信息和 PCR 值一起作为证书内容管理服务器端维护一张“可信版本表”每个版本对应一份 PCR 白名单二是对 PCR 中与代码版本强相关的寄存器比如 PCR4做更细粒度的拆分让版本升级不影响核心安全状态的 PCR 寄存器。实际项目中我更推荐第一种因为实现简单直观即使版本回滚也能明确识别出旧的合法值而不是一概拒绝。4.2 坑二NV 索引被占满PLC 配置写不进去TPM 2.0 提供 NV 存储空间用来保存证书、计数器和配置数据但容量是有限的。OPTIGA 的 NV 空间通常只有几 KB而且其中一部分还要被 TPM 自身管理数据占用。我刚做的一个项目里把每个设备的设备证书、平台证书、JSON 配置全塞到 NV 里结果第二版规划新功能时发现写不进去了。排查过程很有意思用 tpm2_nvreadpublic 枚举所有已定义的 NV 索引发现光是各类证书就占掉了 70% 的空间剩下还要留给 PCR 授权策略数据。后来我们改成了“NV 里只放关键索引和少量关键数据大块证书放到外部加密存储用 TPM 密封的密钥保护”的方案空间问题才缓解。教训是设计阶段就要对 NV 空间做好预算别把所有东西都往硬件里塞。4.3 坑三产线平台证书注册流程没设计好导致良率下降产线上每台设备的 TPM 都有唯一的 EK 证书但批量烧录和注册的时候如果流程设计不合理效率会非常低。我见过一个项目产线用一台工控机逐台设备用 tpm2_createek 生成 EK然后手动上传证书到服务器一台设备要一分钟多在量产高峰完全跟不上。优化后的做法是设备端开机后通过安全通道向产线服务器发起注册请求服务器端准备好一个签发好的“设备身份证书”下发设备把证书导入 NV。整个流程自动化单台设备的注册时间从 60 秒降到了 10 秒以内。这里有个细节注册过程中服务器要验证 EK 证书确实能和设备上报的 EK pub 对应上否则可能存在伪造注册。这一步校验不能省。4.4 坑四休眠唤醒后 TPM 假死在某款低功耗网关上系统休眠唤醒后应用层调用 tpm2 命令一直报 TPM_ERROR_CODE。排查了很久发现是复位电路和电源时序的问题TPM 在休眠时没有被正确复位唤醒后主控已经恢复通信了TPM 还停在低功耗状态。解决方案是在唤醒流程里加一个 GPIO 控制的复位时序先拉低 RESET 至少 5ms再拉高等待 TPM 初始化完成可以读状态寄存器确认再恢复业务。另外电源管理里不能只关 TPM 的时钟还要确保 VCC 掉电完全。这些细节在产品手册里都写了但真正遇到问题的时候才会意识到它们的份量。5. 选型对比与成本权衡什么时候必须上 TPM什么时候用轻量安全元件就够了最后聊一个比较现实的问题TPM 不是唯一的选择项目里到底要不要上 TPM得根据产品形态、威胁模型和成本综合判断。5.1 TPM、安全元件SE和普通加密 MCU 的定位差异我用一张表把这些方案的核心差异列出来方便对比。方案信任根位置典型产品适合场景独立 TPMOPTIGA 等独立安全芯片网关、路由器、PC、服务器、车载需要完整证明链路、多级密钥管理、标准生态安全元件 SE独立安全芯片偏支付/身份SIM 卡、智能门锁、POS 机、车钥匙聚焦身份认证和小额支付证书和密钥管理相对封闭MCU 内置安全区TrustZone/安全子核主控内部手机 SoC、高端工控主控已带安全能力不想增加物料纯软件加密无硬件边界玩具、原型、低价值设备几乎没有物理攻击风险或成本极度敏感TPM 相比 SE 最大的区别在于其标准化的 TPM 2.0 命令集和 PCR/证明机制。SE 更擅长封闭环境下的安全应用比如 Java Card 上的 applet 逻辑TPM 则更像一个对外开放的“可信计算基础设施”上层软件可以灵活地使用它的密钥和证明能力。如果产品有联网、远程管理、可信启动这些需求TPM 的匹配度是明显更高的。5.2 成本考量不是所有设备都值得加一颗 TPM一颗独立 TPM 芯片的物料成本说高不高说低不低但对消费类小设备来说每一分钱都要算。如果一个设备只是做简单的加密通信、本地存储加密面临的主要攻击场景是“固件被读出来逆向”那么用主控内部的安全区或者一颗便宜的 SE 就够了不必上 TPM。反过来如果设备要接入云端平台平台需要对设备身份做强校验或者产品要过等保、CC、FIPS 之类的合规那么 TPM 几乎是最顺理成章的选择。我比较推崇的一个决策思路是先写清楚产品的威胁模型清单再列出合规要求最后做物料成本评估。不要因为“别人都在用 TPM”就追热点也不要因为“成本上涨 5 块钱”就一刀切砍掉。很多安全事故事后看都是当初省掉了不该省的那几块钱。5.3 我的选型建议如果让我给正在评估的团队一个相对通用的建议我会这样说凡是带远程管理、OTA、云端接入能力的网关类设备直接上 TPM 2.0别犹豫。大量出货的一次性消费品如果只存在本地数据保护需求SE 或主控安全区更划算。如果产品要考虑出口和行业合规比如医疗、工业控制、智能汽车尽早引入 TPM 并做好证书体系设计为后续认证准备材料。不管最终选什么产品架构上都要把“密钥不出安全边界”作为刚性约束。这是比选型本身更重要的设计原则。在实际使用中我还有一个体会TPM 的能力只有和上层业务结合起来才能发挥价值。安全启动、远程证明、密钥管理这些不能只当“安全部门的KPI”得真的融进产品的设备生命周期管理流程里让运维、售后、产线都能感知到它带来的好处。比如设备注册自动化、远程诊断状态可信、固件回滚可溯源这些场景一旦跑通团队对 TPM 投入的态度就会从“合规负担”变成“主动依赖”。最后再分享一个小技巧给设备选型 TPM 时记得把 I2C 地址、引脚复用、设备树配置和供货周期放进评审清单最好提前用开发板跑通一套从烧录、注册到远程证明的最小链路再决定批量采购。安全方案的成败从来不是只靠一颗芯片决定的。
返回列表