Как я могу получить ответ TCP через SOCKS5, используя asyncio? - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу выполнить tcp-запрос, используя прокси SOCKS5. Я использую пакеты asyncio и aiosocks и версию python3.7 в Ubuntu 16.04. Вот мой код

ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE

future_connection = aiosocks.open_connection(
proxy=aiosocks.Socks5Addr("127.0.0.1", 1080),
proxy_auth=aiosocks.Socks5Auth("login", "password"),
dst=("192.168.0.101", 8443),
ssl=ssl_context,
remote_resolve=True)

reader, writer = await asyncio.wait_for(future_connection, timeout=self.connection_timeout)
writer.write(b"Hello Message\r\n\r\n")

tcp_data = await asyncio.wait_for(reader.read(1024000), timeout=self.request_timeout)

Но у меня следующая ошибка:

SSL error in data received
protocol: <asyncio.sslproto.SSLProtocol object at 0x7fd923f54c18
transport: <_SelectorSocketTransport fd=6 read=polling write=<idle, bufsize=0
Traceback (most recent call last):
  File "/usr/lib/python3.7/asyncio/sslproto.py", line 526, in data_received
    ssldata, appdata = self._sslpipe.feed_ssldata(data)
  File "/usr/lib/python3.7/asyncio/sslproto.py", line 200, in feed_ssldata
    chunk = self._sslobj.read(self.max_size)
  File "/usr/lib/python3.7/ssl.py", line 707, in read
    v = self._sslobj.read(len)
ssl.SSLError: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:2460)

Также я попытался обновить пакет openssl, моя текущая версия

python3.7 -c "import ssl; print( ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2g  1 Mar 2016

Также код без aiosocks хорошо работает

ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE

future_connection = asyncio.open_connection("192.168.0.101", 8443, ssl=ssl_context)

reader, writer = await asyncio.wait_for(future_connection, timeout=self.connection_timeout)
writer.write(b"Hello Message\r\n\r\n")

tcp_data = await asyncio.wait_for(reader.read(1024000), timeout=self.request_timeout)

Но я пробовал несколько прокси-серверов с одинаковой ошибкой.

Также aiosocks на python3.6 не работает с SSL-соединением из-за этой ошибки https://bugs.python.org/issue23749.

Итак, как я могу получить ответ TCP через SOCKS5, используя asyncio?

...