将 TPM 2.0 Infinenon SLB9673 与 OPC-UA 服务器 (Python) 连接

问题描述 投票:0回答:1

背景:

我们使用 Torizon(Linux 发行版)开发了集成多个传感器和模块系统 (SoM) 的 PCB,该 PCB 的作用之一是托管 OPC-UA 服务器。

我们还在 PCB 上添加了 Infineon 9673 TPM 2.0,通过 I2C 与 Linux SoM 连接,其想法是将加密密钥生成、存储和加密功能(加密/解密、签名等)专用于该 TPM 模块。

OPC-UA服务器运行在SOM中的Docker容器中,TPM架构如下:

  • 容器(SoM)中已经创建了一个CA,负责 验证 OPC-UA 证书(客户端和服务器)。
  • 已在 TPM 中创建持久密钥集(公共 + 私有)。

TPM 中的持久密钥集用于使用此密钥集的句柄 (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 创建 OPC-UA 服务器证书:

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 编程并使用免费的 OPC-UA 库 (https://github.com/FreeOpcUa) 下一步是将证书和私钥(来自 TPM)加载到 OPC-UA 服务器中。

该库提供了以下方法: load_certificate(path) 从文件(pem 或 der)加载服务器证书 加载私钥(路径)

我们知道不可能从 TPM 中提取私钥,因此这就是该模块背后的想法。我们使用机制:tpm2-pkcs#11 创建一个链接到 TPM 中我们的密钥的令牌,然后打开一个会话,允许 OPC-UA 服务器访问我们的私钥以执行加密操作。

PyKCS11 python 库用于此目的,并且可以访问我们的私钥:

lib = self.get_PYKCS11LIB()
print("PYKCS11LIB={}".format(lib))
os.environ["PYKCS11LIB"] = lib
pkcs11 = PyKCS11.PyKCS11Lib()
pkcs11.load(lib)  # define environment variable PYKCS11LIB=YourPKCS11Lib
# Obtention de la liste des slots où un token est présent
slots = pkcs11.getSlotList(tokenPresent=True)
print("Slots disponibles: ", len(slots), slots)

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

print(f"ouverture de session")
session = pkcs11.openSession(slot, CKF_SERIAL_SESSION | CKF_RW_SESSION)

print(f"tentative de login")
session.login(user_pin)

print(f"trouver la première clé privée")
privKey = session.findObjects([(CKA_CLASS, CKO_PRIVATE_KEY)])[0]
print(f"private_key_data: { privKey }")

问题如下:python opc-ua 库似乎只想通过私钥的路径获取文件,这对于 TPM 来说是不可能的,因为它不允许提取私钥。

是否有实现 TPM 与 OPC-UA python 服务器甚至其他编程语言的接口?

本文档来自OPC-UA官方文档: https://opcconnect.opcfoundation.org/2018/06/practical-security-guidelines-for-building-opc-ua-applications/

说明 TPM 提高了 OPC-UA 服务器的安全性。我觉得很奇怪,我们的 TPM 无法与 OPC-UA 服务器的配置连接:

“证书和私钥存储:切勿将私钥或相应的证书文件(.pfx/p12)存储在未加密的文件系统上。使用操作系统的专用证书存储并使用操作系统功能来设置访问权限。 TPM 模块或外部安全硬件(例如用于存储证书和/或私钥的基于 USB 的身份验证令牌)可提高安全级别。”

我做了一些研究来解决这个问题,并在 TPM 中找到了一种机制: tpm2_duplicate -> 在 TPM 中创建的 RSA 私钥,其属性允许其在另一个平台上复制,该密钥受父密钥保护,并且已加密导出。 可以使用此密钥来解密传统文件(PEM 或 DER 格式)中的私钥并将其提供给 OPC-UA python 服务器。

你知道这是否可行吗?

如果是这样,从网络安全的角度来看,此过程不如使用“标准”TPM 私钥(即不离开 TPM 的私钥)可靠,因为我们将把私钥存储在 Linux 中的未加密文件中(SoM)。

python security private-key opc-ua tpm
1个回答
0
投票

切勿将私钥或相应的证书文件 (.pfx/p12) 存储在未加密的文件系统上。

一个简单的解决方案是将私钥文件存储在加密文件系统上,其中只有匹配的用户具有私钥文件的读取权限。

不幸的是,我没有找到任何好的链接,但我高度假设 TPM 可用于提供根证书来加密文件系统/分区。

© www.soinside.com 2019 - 2024. All rights reserved.