【问题标题】:Providing SSL Connections in Python using PKCS#11使用 PKCS#11 在 Python 中提供 SSL 连接
【发布时间】: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


【解决方案1】:

不建议使用 Python 在网络服务器中执行此 TLS 内容。 最好使用 nginx 或 apache 来完成。 它们支持 pkcs#11 SSL 上下文,并且因为它们是用 C 编写的,所以可以快速协商 SSL。

所以继续:

  • 在 Python 端使用 HTTP(不安全)
  • 安装 nginx 或 apache
  • 为 HTTPS 配置它:
    1. 使用 pkcs#11 SSL 证书/密钥(您的 HSM 的 pkcs#11 URI)
    2. 将其反向代理到您的 HTTP(不安全)Python 网络服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多