3. 设备身份密钥的生成与注入
设备身份密钥(Endorsement Key,EK)是 TPM 信任根的起点。它并不是“随便生成一对密钥”,而是要在受控环境中产生、由可信方签发证书、再以不可导出或受保护的方式落到每一台设备上。本节围绕三个工程问题展开:EK 从哪里来、证书链如何绑定到设备身份、产线如何安全注入并验证。
一、EK 的两种生成方式:内部生成与外部注入
TPM 2.0 规范允许 EK 以两种方式存在。第一种是内部生成:由 TPM 内部的随机数发生器和密钥引擎生成 EK 密钥对,私钥永不离开 TPM 的受保护存储区,外部只能通过 TPM 命令获得公钥和 EK 证书。这种方式安全性最高,但要求每颗 TPM 在产线阶段完成一次“生成—取公钥—签发证书—写回证书”的闭环。
第二种是外部注入:由产线或密钥管理系统在外部生成 EK 密钥对,再将私钥导入 TPM。这种方式便于集中管理和批量签发,但私钥在导入前曾以明文或受保护形式存在于 TPM 之外,必须依赖导入会话的加密与完整性保护。工程上更推荐内部生成,仅在芯片不支持或供应链要求集中托管时采用外部注入。
无论哪种方式,EK 都分为低阶 EK(EK Low Range)与高阶 EK(EK High Range)。低阶 EK 用于 RSA 2048 等传统算法,高阶 EK 用于 ECC P256 等算法。产线需要根据设备支持的算法族分别生成或注入,并在证书中明确算法标识,避免后续远程证明时出现算法不匹配。
二、证书链绑定:从 EK 公钥到设备身份
EK 公钥本身只是一串数据,必须由可信的 EK 证书签发者(EK Certificate Authority)签发证书,才能被远程方验证。典型的证书链为:厂商根 CA → 中间 CA → EK 证书。EK 证书的 Subject 通常包含厂商、型号、批次等信息,公钥字段即 TPM 的 EK 公钥,扩展字段中可携带 TPM 规范版本、EK 类型(RSA/ECC)、低阶/高阶标识等。
证书链绑定的关键在于:远程方拿到 EK 证书后,必须能用厂商根 CA 验证签名,并确认证书中的公钥与设备实际持有的 EK 私钥匹配。匹配验证通常通过 TPM2_ActivateCredential 或 TPM2_Certify 完成——前者证明“该设备持有与证书公钥对应的私钥”,后者由 TPM 对某个密钥或状态进行签名背书。只有证书链验证与私钥持有证明同时通过,设备身份才真正可信。
三、产线注入与安全烧录的工程实践
产线注入的核心目标是:每台设备在出厂前完成 EK 生成、证书签发、证书写入和回读校验,且整个过程可追溯、可审计、不可篡改。以下是一个可参考的产线工站流程与关键参数示例。
工站一:TPM 初始化与 EK 生成。设备上电后,产线程序通过 TPM2_Startup 初始化 TPM,然后执行 TPM2_CreatePrimary 在 Endorsement Hierarchy 下创建 EK 主密钥。关键参数包括:hierarchy = TPM_RH_ENDORSEMENT,template = EK Template(RSA 2048 或 ECC P256),authPolicy = 空(EK 通常无授权策略,便于远程验证)。生成后通过 TPM2_ReadPublic 读取公钥和名称(Name),名称是公钥的哈希,用于后续绑定。
工站二:证书签发。产线程序将 EK 公钥、设备序列号、批次号提交给 EK CA。CA 验证请求来源合法后,签发 EK 证书。证书中应包含:Subject 为设备唯一标识,Issuer 为中间 CA,Public Key 为 EK 公钥,扩展字段包含 TPM 版本、EK 类型、低阶/高阶标识。签发完成后,证书以 DER 格式返回产线。
工站三:安全烧录。将 EK 证书写入 TPM 的 NV 索引。推荐使用 TPM2_NV_DefineSpace 定义索引,属性设置为 TPMA_NV_PPWRITE | TPMA_NV_PLATFORMCREATE | TPMA_NV_OWNERREAD,确保只有平台级授权才能写入,且读取受所有者授权保护。写入使用 TPM2_NV_Write,写入后立即用 TPM2_NV_Read 回读,比对证书哈希与 CA 返回值是否一致。
工站四:回读校验与记录。回读校验通过后,产线系统记录设备序列号、EK 公钥哈希、证书序列号、写入时间、工站编号,形成不可篡改的注入日志。若回读失败,设备进入返修流程,不得流入下一工站。
四、常见问题与判断依据
产线注入过程中,最常见的异常是“证书公钥与 TPM 实际 EK 不匹配”。判断依据是:用 TPM2_ActivateCredential 构造挑战,若 TPM 能正确解密并返回秘密值,说明私钥匹配;若返回 TPM_RC_INTEGRITY 或 TPM_RC_VALUE,则说明证书与设备不匹配。另一个常见问题是 NV 索引写入失败,通常是因为索引已存在或属性配置错误,需先检查 TPM2_NV_ReadPublic 返回的索引属性。
对于外部注入方式,还需额外验证导入会话的加密完整性。导入前应使用 TPM2_Import 将外部私钥绑定到 TPM 的种子密钥上,确保私钥在传输过程中始终处于加密状态。导入完成后,同样需要通过 TPM2_ReadPublic 和 ActivateCredential 验证私钥可用性。
总结来说,EK 生成与注入不是单一命令,而是一条从密钥生成、证书签发、安全烧录到回读校验的完整工程链。每个环节都需要明确的输入、可观察的中间状态和可判断的结果,才能保证设备身份在出厂时就是可信的。