Один зайвий перевід рядка може зламати 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, обробляйте часткові читання та зберігайте все, що прочитано за заголовками. Одне читання сокета не обов'язково містить одне ціле повідомлення.
Якщо цей парсер ваш, порівняйте відредаговане подання байтів із граматикою дроту; тримайте довжини та межі рядків видимими, приховуючи пароль. Для застосунку, якому потрібен лише проксі-зв'язок, підтримуваний конектор позбавляє потреби володіти цим кодом розмітки.