我如何使用asyncio.sslproto.SSLProtocol?

时间:2017-12-07 09:47:22

标签: async-await python-3.5 python-asyncio

我正在尝试使用JSON-RPC over TLS与ElectrumX服务器通信,但是通过Tor(本地主机上的SOCKS代理)。

运行以下代码时,drain()中的asyncio.streams正在SSLProtocol中调用_drain_helper,我不知道如何实施。

如果我只是让它成为无操作,它似乎不起作用。

我知道JSON-RPC服务器正在运行,因为我已经使用

进行了测试
echo -ne '{"id":0,"args":["3.0.2","1.1"],"method":"server.version"}\n' | socat stdio openssl-connect:songbird.bauerj.eu:50002,verify=0

我尝试在Python中通过SOCKS使用TLS和asyncio:

from asyncio.sslproto import SSLProtocol
import aiosocks
import asyncio

loop = None

class MySSLProtocol(SSLProtocol):
    def __init__(otherself):
        super().__init__(loop, None,      False  , None)
        #                      app_proto  context  waiter

async def l(fut):
    try:
        socks4addr = aiosocks.Socks4Addr("127.0.0.1", 9050)
        transport, protocol = await aiosocks.create_connection(MySSLProtocol, proxy=socks4addr, proxy_auth=None, dst=("songbird.bauerj.eu", 50002))
        reader = asyncio.StreamReader()
        reader.set_transport(transport)
        writer = asyncio.StreamWriter(transport, protocol, reader, loop)
        writer.write(b'{"id":0,"method":"server.version","args":["3.0.2", "1.1"]}\n')
        await writer.drain()
        print(await reader.readuntil(b"\n"))
        fut.set_result("finished")
    except BaseException as e:
        fut.set_exception(e)


def f():
    global loop
    loop = asyncio.get_event_loop()
    fut = asyncio.Future()
    asyncio.ensure_future(l(fut))
    loop.run_until_complete(fut)
    print(fut.result())
    loop.close()

f()

我正在使用主人的aiosocks。提交932374c

1 个答案:

答案 0 :(得分:0)

asyncio.sslprotoSSLProtocol是asyncio私有API的一部分。

你不应该直接使用该类或从中派生。

要使用SSL,请将正常协议(源自asyncio.Protocol)和ssl.SSLContext作为ssl param传递到loop.create_connection() / loop.create_server()