basi c аутентификация сокеты прокси https, отображающие ошибку декодирования tlsv1 после установления соединения - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь подключиться к прокси-серверу с проверкой подлинности https с помощью basi c auth (user: pass с кодировкой b64). Мне удалось заставить прокси без авторизации работать нормально, но я недавно купил прокси, и теперь мне нужно, чтобы авторизованные прокси работали. Это казалось простым, все, что мне нужно было сделать, это добавить заголовок «прокси-авторизация», и все заработало. После этого все заработало, и я получил ответ «200 соединений установлено». После этого я пытаюсь обернуть сокет ssl библиотекой "ssl". Это приводит к появлению следующей ошибки: «Ошибка декодирования tlsv1». Посмотрев на некоторые сообщения в стеке, я решил, что мне нужно изменить используемую версию протокола, я попытался использовать любую другую доступную версию, которая по какой-то причине все еще приводила к ошибке, о которой я говорил выше (это было странно, потому что я не использовал "tlsv1" .

credentials = base64.encodebytes(b"user:pass").decode().strip(r"\n")
s.connect((proxy[0], int(proxy[1])))
s.send(f"CONNECT site.com:443 HTTP/1.1\r\nProxy-Authorization: Basic {credentials}\r\nHost: site.com\r\n\r\n".encode())
connect_response = s.recv(4096)
print(connect_response)
s = wrap_socket(s)

Проведя дополнительные исследования, я выяснил, что это может иметь какое-то отношение к заголовку ответа «область». Я не смог найти никаких документов по этому поводу и не знаю, для чего он используется. Это заставляет меня поверить в то, что я делаю что-то не так, и мне нужно выполнить больше действий, прежде чем я попытаюсь обернуть сокет. Мой вопрос: почему я получаю эту ошибку / трассировку при попытке обернуть сокет и как я могу это исправить?

1 Ответ

0 голосов
/ 21 июня 2020

Если вы распечатаете запрос перед его отправкой, вы увидите следующее:

b'CONNECT google.com:443 HTTP/1.1\r\nProxy-Authorization: Basic dXNlcjpwYXNz\n\r\nHost: google.com\r\n\r\n'

Обратите внимание на \n\r\n в конце заголовка Proxy-Authorization. Это просто неправильно, т.е. должно быть только \r\n.

Из-за постороннего \n эти символы фактически интерпретируются как конец HTTP-заголовка, а остальные Host: google.com\r\n\r\n останутся непрочитанными. сервер пока. Он считывается только тогда, когда ожидается подтверждение TLS, т.е. Host: google.com\r\n\r\n будет интерпретироваться сервером как часть TLS ClientHello и, таким образом, рукопожатие TLS завершится ошибкой. 1014 * в конце. Хотя вы пробовали это с помощью strip(r"\n"), правильным способом будет только strip("\n"): вы хотите удалить 1-байтовый символ "\n", а не 2-байтовую строку r"\n".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...