2017-12-07 7 views
0

Ich versuche, mit einem ElectrumX-Server mit JSON-RPC über TLS, aber über Tor (SOCKS-Proxy auf localhost) zu sprechen.Wie verwende ich asyncio.sslproto.SSLProtocol?

Beim Ausführen des folgenden Codes ruft drain() in asyncio.streams_drain_helper in SSLProtocol, die ich nicht implementieren kann.

Wenn ich es nur ein No-Op mache, scheint es nicht zu funktionieren.

Ich weiß, dass das JSON-RPC-Server arbeiten, weil ich mit

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

Mein Versuch getestet haben bei TLS durch SOCKS in Python mit asyncio mit:

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() 

ich verwende aiosocks aus Meister. Commit 932374c

Antwort

-1

asyncio.sslproto und SSLProtocol sind Teil von asyncio private API.

Sie sollten die Klasse niemals direkt verwenden oder daraus ableiten.

Für mit SSL arbeiten Sie übergeben normales Protokoll (abgeleitet von asyncio.Protocol) und ssl.SSLContext als ssl param in loop.create_connection()/loop.create_server().

+0

Wie gesagt, ich möchte SSL in SOCKS getunnelt verwenden. Wenn SSL an create_connection übergeben wird, bekomme ich eine SSL-verschlüsselte SOCKS-Verbindung, ich möchte es umgekehrt. Wenn Sie nicht glauben, dass SSLProtocol die geeignete Lösung ist, zeigen Sie mir, wie Sie SSL in SOCKS ohne es tun können. –