Один лишний перевод строки может сломать TLS после CONNECT
Проверьте разметку HTTP-заголовков, когда написанный вручную прокси-коннектор открывает туннель и сразу выдаёт ошибку декодирования TLS.
Когда CONNECT возвращает 200, а TLS сразу не декодируется, проверьте граничные байты в коннекторе, прежде чем менять сертификаты или шифры.
Сгенерированное значение авторизации может уже заканчиваться переводом строки. Добавление ещё одного конца строки может завершить HTTP-заголовки раньше времени, оставив нужное поле Host или другой открытый текст за запросом.
Минимальный запрос HTTP/1.1 CONNECT использует CRLF между строками и пустую строку в конце:
b"CONNECT example.com:443 HTTP/1.1\r\nHost: example.com:443\r\n\r\n"Поместите любое поле авторизации перед этой последней пустой строкой, без встроенного перевода строки. В Python "\n" обозначает перевод строки, а сырая строка с обратной косой чертой и буквой n — нет. Проверьте, какие байты создаёт помощник кодирования, прежде чем пытаться их удалить—старые помощники могли добавлять переводы строк.
После успешного CONNECT эти оставшиеся байты принадлежат протоколу туннеля. Заблудившийся открытый текст может попасть к партнёру, ожидающему TLS. Успешный статус не может исправить байты, уже поставленные в очередь после некорректного запроса.
Проверьте и границу приёма. Прочитайте полный ответ прокси, прежде чем передать сокет TLS, обрабатывайте частичные чтения и сохраняйте всё, что прочитано за заголовками. Одно чтение сокета не обязано содержать одно целое сообщение.
Если этот парсер ваш, сравните отредактированное представление байтов с грамматикой провода; держите длины и границы строк видимыми, скрывая пароль. Для приложения, которому нужен только прокси-доступ, поддерживаемый коннектор избавляет от необходимости владеть этим кодом разметки.