You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Infineon SLB9673 TPM 2.0与Python OPC-UA服务器对接的技术实现及安全问题咨询

Infineon SLB9673 TPM 2.0与Python OPC-UA服务器对接的技术实现及安全问题咨询

我们开发了一块集成多个传感器和SoM(基于Torizon Linux发行版)的PCB,核心功能之一是运行OPC-UA服务器。为提升安全性,我们在PCB上集成了Infineon 9673 TPM 2.0模块,通过I2C与SoM连接,计划将密钥生成、存储以及加解密、签名等密码学操作全部交由TPM处理。

目前的配置情况:

  • OPC-UA服务器运行在SoM的Docker容器中,容器内创建了CA,负责验证OPC-UA客户端和服务器的证书
  • TPM中已创建一套持久化密钥对(公钥+私钥)

服务器证书生成流程

我们通过TPM密钥对的Handle(0xhandle)生成了OPC-UA服务器证书的CSR,命令如下:

openssl req -provider tpm2 -provider default -propquery '?provider=tpm2' -new -subj "/C=FR/O=entreprise/CN=Certificat_Server_OPC_UA" -key handle:0xhandle -out server_rsa.csr

接着用CA和该CSR生成服务器证书:

openssl x509 -req in server_opc_ua.csr -CA /path/to/CA/ca.crt -CAkey /path/to/cakey/ca.key -CAcreateserial -out serveur_opc_ua_certificate.crt -days 365 sha256

之后通过以下命令验证证书有效性,确认生成过程无问题:

openssl x509 -in server_opc_ua_certificate.crt -noout -text 

客户端证书计划

对于要连接OPC-UA服务器的客户端,我们设想让它们各自发送CSR到SoM,由SoM完成证书签发后返回给客户端。

当前核心问题

我们的OPC-UA服务器基于Python编写,使用Free OPC-UA库。该库提供的加载方法:

  • load_certificate(path):从PEM/DER格式文件加载服务器证书
  • load_private_key(path):从文件加载私钥

但TPM的核心安全特性就是私钥不可导出。我们尝试用tpm2-pkcs#11机制创建关联TPM密钥的令牌,并用PyKCS11库成功访问到私钥,代码如下:

lib = self.get_PYKCS11LIB()
print("PYKCS11LIB={}".format(lib))
os.environ["PYKCS11LIB"] = lib
pkcs11 = PyKCS11.PyKCS11Lib()
pkcs11.load(lib)  # 需设置环境变量PYKCS11LIB=你的PKCS11库路径
# 获取存在令牌的插槽列表
slots = pkcs11.getSlotList(tokenPresent=True)
print("Slots disponibles: ", len(slots), slots)

slot = pkcs11.getSlotList(tokenPresent=True)[0]
print(f"slot : {slot}")

print(f"打开会话")
session = pkcs11.openSession(slot, CKF_SERIAL_SESSION | CKF_RW_SESSION)

print(f"尝试登录")
session.login(user_pin)

print(f"查找第一个私钥")
privKey = session.findObjects([(CKA_CLASS, CKO_PRIVATE_KEY)])[0]
print(f"private_key_data: { privKey }")

但Free OPC-UA库仅支持通过文件路径加载私钥,无法直接使用PyKCS11获取到的TPM私钥对象。

我们的疑问

  1. 是否有现成的实现方案(Python或其他编程语言),可实现TPM与OPC-UA服务器的对接?
  2. OPC-UA官方文档提到:

证书和私钥存储:绝对不要将私钥或对应的证书文件(.pfx/p12)存储在未加密的文件系统上。使用操作系统专用的证书存储,并利用操作系统的权限设置功能。TPM模块或基于USB的认证令牌等外部安全硬件来存储证书和/或私钥,可以提升安全级别。

既然官方推荐用TPM提升安全性,我们觉得无法对接的情况不太合理,想确认是否遗漏了某些方法。
3. 我们想到一个变通方案:利用TPM的tpm2_duplicate功能,将TPM中创建的、带有可复制属性的RSA私钥(受父密钥保护,加密导出)复制出来,解密为传统PEM/DER格式文件后供OPC-UA库使用。请问该方案是否可行?若可行,从网络安全角度看,这种方式是否比让私钥始终留在TPM内的标准方式安全性更低?毕竟要将私钥存储在Linux SoM的文件中,哪怕加密存储也存在风险。

备注:内容来源于stack exchange,提问作者Autolab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:05:27