如何使用 PKCS11 在 python 中建立 TLS 会话

How to establish TLS session in python using PKCS11

我正在尝试在我控制的客户端和网络服务器之间建立 TLS 通道。客户端和服务器都使用我在私有 PKI 方案下创建的证书对自己进行身份验证。客户端密钥和证书存储在 USB 加密狗类型 HSM 上。 Python 是主要的应用程序语言。

我可以使用 python-pkcs11 包为我的项目执行所有必需的加密操作,例如 AES 加密、HMAC 签名、RSA 签名等。但是,我找不到方法“绑定”pkcs11 到任何 TLS 库。我的意思是调用处理 pkcs11 层并建立 TLS 通道的函数的“Pythonic”方式。请求不支持 pkcs11。 libcurl 支持 pkcs11,但 pycurlpyopenssl 均未实现。

我可以使用 openssl 的 s_client CLI 工具使用引擎 api:

openssl s_client -engine pkcs11 -verify 2 -CAfile path/to/CA.pem -keyform engine -key "pkcs11:...;object=rsa;type=private" -cert path/to/client-cert.pem -connect localhost:8443

我正在寻找的示例:

do_tls_with_pkcs(key=’pkcs11:URL’, cert=’cert.pem’, verify=’CA-cert.pem’)

据我所知,还没有这样的图书馆存在。现在我正在寻找解决方法。

我读到如果 openssl、libp11 和 python 以这种方式编译,则可以抽象所有这些,因此简单的请求调用将通过 HSM,对应用程序代码透明。虽然,我找不到任何关于如何做的 material。

我遇到了类似的问题,因为我想在 Python requests.

中使用 PKCS#11 令牌(YubiKey,PIV 小程序)

我想到了https://github.com/cedric-dufour/scriptisms/blob/master/misc/m2requests.py

它是不完美的,因为它不使用连接池并且不支持 HTTP 流或代理——就像 requests 的标准 HTTPS 适配器一样——但它确实用于与需要 mTLS 的后端的简单连接的作业。