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

B. *_*lan 8 python ssl openssl pkcs#11

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

我能够使用python-pkcs11AES 加密、HMAC 签名、RSA 签名等包为我的项目执行所有必需的加密操作。但是,我找不到将 pkcs11“绑定”到任何 TLS 库的方法。我的意思是调用处理 pkcs11 层并建立 TLS 通道的函数的“Pythonic”方式。请求不支持 pkcs11。libcurl有PKCS11支持,但它不是在执行pycurl,没有pyopenssl

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

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,对应用程序代码透明。虽然,我找不到任何关于如何做的材料。

Céd*_*our 2

我遇到了类似的问题,因为我想在 Python请求中使用 PKCS#11 令牌(YubiKey、PIV 小程序)。

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

它是不完美的,因为它不使用连接池,也不支持 HTTP 流或代理(就像requests的库存 HTTPS 适配器一样),但它可以完成与需要 mTLS 的后端的简单连接。

  • @B.Ceylan,我可以问你你走的是哪条路吗?我正在寻找类似的解决方案。 (2认同)