2015-06-15 3 views
1

У меня есть питон фрагмент кода, который использует asyncio и инициирует «простой» соединение:Запуск связи Tls с питоном asyncio

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

Дело в том, мои простые переключатели соединения с ДУС один раз некоторые биржи произошло , В традиционном пути можно было бы сделать это:

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

Но я не знаю, как я могу справиться с этим с asyncio. Мой метод data_received получает зашифрованный контент, поэтому, я думаю, я могу что-то сделать, чтобы его расшифровать, но я не могу понять это.

+2

Камяр прав: официального выхода в 3.4 нет. Существует [билет открыт] (https://github.com/python/asyncio/issues/79), который может быть исправлен в 3.6. До тех пор у меня есть супер-хакерское, недействительное гарантийное решение: 'self._transport = self._loop._make_ssl_transport (self._transport._sock, self, ssl_context, server_side = True)'. Это предполагает, что ваш протокол сохраняет ссылку на транспорт в 'self._transport' и ссылку на цикл событий в' self._loop'. –

ответ

1

К сожалению, до python 3.5 нет стандартного способа сделать это! Начиная с python 3.5, в модуле ssl есть новая вещь, называемая MemoryBIO, с которой вы можете обернуть свой сокет для TLS. У вас есть несколько вариантов здесь:

  1. традиционного (SYNC) разъем Использование Python и loop.executor для упаковки его в асинхронной сопрограмме.

  2. Использование SSL вместо TLS. Большинство серверов позволяют, но все еще есть исключения

0

Решение, которое используют только публичный API из asyncio (как APN, от Apple!):

Сделайте копию create_connection и изменить его, чтобы его возвращение (всего несколько строк) и использовать функции низкого уровня для его работы (например, sock_connect, sock_read). Когда вам нужно запуститьSSL, просто передайте носок в open_connection