Глядя на код для потокового API, вы заметите, что StreamReader и StreamWriter хранят свой транспорт во внутренней _transport
переменной. Оказывается, если вы вызываете start_tls () и затем сохраняете новый транспорт в этих переменных, он работает нормально. Конечно, действуют все обычные предостережения при использовании внутреннего API. Вот как это выглядит для сервера. На клиенте, я думаю, вы можете просто отбросить биты load_cert_chain
и server_side
.
transport = writer.transport
protocol = transport.get_protocol()
loop = asyncio.get_event_loop()
ssl_context = ssl.SSLContext()
ssl_context.load_cert_chain("/path/to/certchain", "/path/to/key")
new_transport = await loop.start_tls(
transport, protocol, ssl_context, server_side=True)
writer._transport = new_transport
reader._transport = new_transport