【问题标题】:Starting a tls communication with python asyncio使用 python asyncio 启动 tls 通信
【发布时间】:2016-01-27 11:05:10
【问题描述】:

我有一些 python 代码 sn-p 使用 asyncio 并启动“普通”连接:

loop = asyncio.get_event_loop()
coro = loop.create_connection(lambda: MyCustomClassProtocol(loop), sock=client_socket)
loop.run_until_complete(coro)

关键是一旦发生一些交换,我的普通连接就会切换到 tls 连接。以传统方式,人们会这样做:

ssl_sock = ssl.wrap_socket(client_socket, do_handshake_on_connect=False)
ssl_sock.do_handshake()

但我真的不知道如何使用asyncio 处理这个问题。我的data_received 方法虽然接收到加密内容,所以我想我可以做一些事情来解密它,但我无法弄清楚。

【问题讨论】:

  • Kamyar 是正确的:在 3.4 中没有官方方法可以做到这一点。有一个ticket open 可能会在 3.6 中得到修复。在那之前,我有一个超级hacky,保修无效的解决方法:self._transport = self._loop._make_ssl_transport(self._transport._sock, self, ssl_context, server_side=True)。这假定您的协议在 self._transport 中保存了对传输的引用,并在 self._loop 中保存了对事件循环的引用。

标签: python ssl


【解决方案1】:

不幸的是,直到 python 3.5 还没有标准的方法来做到这一点!从 python 3.5 开始,ssl 模块中有一个名为 MemoryBIO 的新东西,您可以使用它为 TLS 包装套接字。 你有几个选择:

  1. 使用 Python 传统(同步)套接字和 loop.executor 将其包装在异步协程中。

  2. 使用 SSL 而不是 TLS。大多数服务器都允许,但也有例外(比如 Apple 的 APN!)

【讨论】:

    【解决方案2】:

    仅使用 asyncio 的公共 API 的解决方案:

    复制create_connection 并修改它使其返回socket 对象(仅几行),并使用低级函数对其进行操作(如sock_connect、sock_read)。当你需要启动SSL时,只需将sock传递给open_connection

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2018-03-31
      • 2020-12-29
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多