Python сокеты прокси неправильная версия ssl и странный байтовый ответ - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь подключиться к прокси-серверу https через сокеты python.

Сначала я хотел бы начать с того, что могу сделать это без прокси, поэтому я знаю, что мой код работает без них, но мне нужны прокси. Я также уверен, что мой запрос CONNECT работает, потому что после этого я получаю сообщение «200 соединение установлено».

Это означает, что моя ssl-часть отключена, особенно в функции / части wrap_socket моего кода. Я попытался не использовать ssl (не думал, что это сработает, но я просто подумал, что могу попробовать), и он отправил мне странный шестнадцатеричный ответ, который, поискав его, я обнаружил, что это из-за «искаженного HTTP-запроса. ». Для меня это не имело смысла, поэтому я продолжал пытаться использовать разные версии ssl, включая tlsv1, а затем, наконец, попробовал sslv3. Это очевидно испорчено на моем компьютере и других, потому что я получаю as = wrap_socket (s, ssl_version = ssl.PROTOCOL_SSLv3) AttributeError: модуль 'ssl' не имеет атрибута 'PROTOCOL_SSLv3' ”” ошибка.

Перед этим я пытался не указывать версию ssl, но получил «неправильную версию». Итак, после всего этого тестирования я не могу понять, какую версию ssl использовать и почему, и я также не могу подтвердить, что sslv3 работает, потому что я получаю указанную выше ошибку. Я уверен, что мой прокси-запрос-свечение работает, но я также могу ошибаться в этой области.

У меня вопрос: что я здесь делаю не так? В частности, ssl-часть.

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try: s.connect((proxy.split(":")[0], int(proxy.split(":")[1]))) #connect to proxy
    except:
        self.proxy_errors+=1
        return

    s.send("CONNECT site.com:443 HTTP/1.1\r\nHost: site.com\r\n\r\n".encode())

    #s = wrap_socket(s)

1 Ответ

1 голос
/ 19 июня 2020
s.send("CONNECT site.com:443 HTTP/1.1\r\nHost: site.com\r\n\r\n".encode())

#s = wrap_socket(s)

На основе этого фрагмента кода вы отправляете запрос CONNECT, а затем сразу же пытаетесь обновить сокет до TLS. Но сначала вам нужно прочитать ответ от прокси (например, HTTP/1.1 200 .... В противном случае текстовый ответ на запрос CONNECT будет рассматриваться как часть рукопожатия TLS, что приводит к сбою рукопожатия со странными ошибками.

...