我有一些使用asyncio并启动“普通”连接的 python 代码片段:
loop = asyncio.get_event_loop()
coro = loop.create_connection(lambda: MyCustomClassProtocol(loop), sock=client_socket)
loop.run_until_complete(coro)
Run Code Online (Sandbox Code Playgroud)
重点是,一旦发生一些交换,我的普通连接就会切换到 tls 连接。按照传统的方式,人们会这样做:
ssl_sock = ssl.wrap_socket(client_socket, do_handshake_on_connect=False)
ssl_sock.do_handshake()
Run Code Online (Sandbox Code Playgroud)
但我真的不知道如何处理这个问题asyncio。我的data_received方法虽然收到了加密的内容,所以我想我可以做一些事情来解密它,但我无法弄清楚。
不幸的是,直到 python 3.5 还没有标准的方法来做到这一点!从 python 3.5 开始,ssl 模块中有一个名为 MemoryBIO 的新东西,您可以使用它来包装 TLS 的套接字。您在这里有几个选择:
使用Python传统(同步)套接字和loop.executor将其包装在异步协程中。
使用 SSL 而不是 TLS。大多数服务器都允许,但仍有例外(例如 Apple 的 APN!)