TL;DR веб-клиент использует CONNECT
только тогда, когда он знает, что взаимодействует с прокси-сервером, а окончательный URI начинается с https://
.
Когда браузер говорит:
CONNECT www.google.com:443 HTTP/1.1
это значит:
Привет, прокси, пожалуйста, откройте необработанное TCP-соединение с Google; любые следующие байты, которые я пишу, вы просто повторяете по этому соединению без какой-либо интерпретации. Да, и еще одна вещь. Делайте это только в том случае, если вы общаетесь с Google напрямую, но если вы сами используете другой прокси-сервер, вместо этого просто сообщите им то же самое CONNECT
.
Обратите внимание, что это ничего не говорит о TLS (https). На самом деле CONNECT
ортогонален TLS; вы можете иметь только один, вы можете иметь другой, или вы можете иметь их оба.
При этом цель CONNECT
состоит в том, чтобы разрешить сеанс TLS со сквозным шифрованием, поэтому данные не могут быть прочитаны прокси-сервером (или всей цепочкой прокси-серверов). Это работает, даже если прокси вообще не понимает TLS, потому что CONNECT
может выдаваться внутри простого HTTP и не требует от прокси ничего, кроме копирования необработанных байтов.
А вот подключение к первому прокси может быть TLS (https), хотя это означает двойное шифрование трафика между вами и первым прокси.
Очевидно, что нет смысла CONNECT
при прямом общении с конечным сервером. Вы просто начинаете говорить TLS, а затем выдаете HTTP GET
. Конечные серверы обычно полностью отключают CONNECT
.
Для прокси-сервера поддержка CONNECT
добавляет риски безопасности. Через CONNECT
могут быть переданы любые данные, даже попытка взлома ssh на сервер 192.168.1.*, даже рассылка спама по SMTP. Внешний мир воспринимает эти атаки как обычные TCP-соединения, инициированные прокси. Им все равно, в чем причина, они не могут проверить, виноват ли HTTP CONNECT
. Следовательно, прокси-серверы должны обезопасить себя от неправильного использования.
person
kubanczyk
schedule
30.10.2016