【发布时间】:2016-12-15 18:28:42
【问题描述】:
我必须在基于 Linux 的固件上为嵌入式系统组件实现基于 Python 的 Web 服务器:
class WebServer(http.server.HTTPServer)
...
...
为了启用 ssl 连接,在服务器中创建一个 ssl 上下文
self.ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
self.ssl_context.load_cert_chain(certfile=cert, keyfile=key)
self.ssl_context.verify_mode = ssl.CERT_REQUIRED
self.ssl_context.load_verify_locations(verifyCert)
注意:cert 是证书的文件路径,keyfile 是私钥的路径。
根据请求调用 get_request 方法:
def get_request(self):
request = self.socket.accept()
if self.ssl_context:
req_socket, addr = request
connstream = self.ssl_context.wrap_socket(req_socket, server_side=True)
return connstream, addr
else:
return request
wrap_socket 方法用于将原始套接字包装成一个 ssl 套接字,而不是返回该套接字。这就是提供 ssl 连接的全部内容。
现在的问题是:
该解决方案是第一次实施,并不安全。我们有义务使用给定的硬件安全模块 (HSM) 来创建和存储证书和私钥。任何私钥都是完全隐藏的,永远不会离开模块。所有密码原语都必须直接在模块内执行。 HSM 的接口是 PKCS#11,存在供应商提供的动态中间件库。
如何使用模块而不是原始 ssl 在 python 下设置 ssl 上下文?我已经知道,ssl 是基于 openSSL 的,存在一个 PKCS#11 引擎(库 opensc-pkcs11.so)。供应商的中间件提供 PKCS#11 API。
不幸的是,我没有计划如何将 PKCS#11 引擎集成到 python 的 ssl/openSSL 中,以及如何将所有东西结合在一起。甚至可以透明地使用 PKCS#11 而不是本机实现,如果可以,我如何从 python 激活它?此外,我将如何传递参数“certfile”和“keyfile”,因为它们不再作为普通文件可用?事实上,我无法直接访问私钥;只有基于 URL 的 HSM 中用于对其进行操作的对象的引用。
PyKCS11 能否代替 ssl 成为解决方案?
我只需要知道解决此类问题的基本途径。我可以自己找到所有详细信息。
【问题讨论】:
-
你找到解决方案/路径了吗?
-
你能做到吗?
标签: python sockets ssl pkcs#11