Протоколы · 1 мин чтения

Метод HTTP CONNECT: как он работает

CONNECT — метод HTTP, благодаря которому HTTPS работает через прокси. Вместо того чтобы загрузить страницу, он просит прокси открыть «сырой» туннель до назначения, чтобы шифрованный трафик прошёл нетронутым. Разбираем работу CONNECT шаг за шагом.

Зачем нужен CONNECT

Обычный HTTP-прокси работает так: читает ваш запрос, забирает ресурс и возвращает его вам — то есть видит и перегоняет весь запрос и весь ответ. Для чистого HTTP это нормально, но с HTTPS ломается: весь смысл TLS в том, что ни один посредник не читает трафик, поэтому прокси не может просто «сходить за страницей» вместо вас, не сломав шифрование.

Метод CONNECT решает это. Вместо того чтобы просить прокси что-то достать, ваш клиент просит его открыть сырой TCP-туннель к хосту и порту и отойти в сторону. Как только туннель открыт, клиент выполняет TLS-рукопожатие напрямую с назначением через прокси, а прокси вслепую перегоняет шифрованные байты в обе стороны. Открытого текста он не видит — только непрозрачный поток и, из строки CONNECT и SNI в TLS, имя хоста назначения. Именно так HTTP-прокси s4m на порту 3128 носит HTTPS.

Как устанавливается туннель

Схема короткая и конкретная:

  1. Ваш клиент отправляет прокси CONNECT example.com:443 HTTP/1.1 с заголовком Host и, если нужно, учётными данными в Proxy-Authorization.
  2. Прокси открывает TCP-соединение к example.com:443.
  3. Если получилось, прокси отвечает HTTP/1.1 200 Connection Established. С этого момента соединение — голый туннель, никакой семантики HTTP больше нет.
  4. Теперь клиент прогоняет TLS-рукопожатие напрямую с example.com через этот туннель, и все дальнейшие данные приложения шифруются сквозным образом.

Отсюда два следствия. Во-первых, TLS остаётся по-настоящему сквозным: прокси ничего не аутентифицирует и ничего не читает внутри туннеля, поэтому сертификат проверяется между вашим клиентом и настоящим сервером. Во-вторых, поскольку CONNECT просто открывает TCP-туннель, прокси в принципе способен протянуть и другие протоколы поверх TLS или вообще любые, на других портах, — именно поэтому прокси обычно ограничивают CONNECT портом 443 (и парой других), чтобы не превратиться в открытый релей.

Посмотреть на CONNECT через curl

Для https:// URL через HTTP-прокси curl отправляет CONNECT сам. Добавьте -v, чтобы увидеть запрос CONNECT и ответ «200 Connection Established».

bash
# Verbose: watch the CONNECT handshake to the proxy, then TLS to the site
curl -v -x http://USER:[email protected]:3128 https://example.com 2>&1 \
  | grep -Ei 'CONNECT|Connection established|SSL connection|Proxy-Auth'

# You'll see, in order:
#   > CONNECT example.com:443 HTTP/1.1        (client asks for a tunnel)
#   < HTTP/1.1 200 Connection established     (proxy opened the tunnel)
#   * SSL connection using TLSv1.3 ...        (TLS is end-to-end, past proxy)

# Contrast: plain HTTP needs no tunnel; the proxy relays the request itself:
curl -v -x http://USER:[email protected]:3128 http://example.com 2>&1 \
  | grep -Ei 'GET http|absolute'
Поделиться страницей
FAQ

Ответы на вопросы

Что делает метод HTTP CONNECT?

Он просит прокси открыть сырой TCP-туннель к хосту и порту назначения, а не забрать ресурс. Как только прокси ответил 200 Connection Established, клиент прогоняет собственное TLS-рукопожатие и шифрованные данные прямо до назначения, а прокси лишь перегоняет непрозрачные байты. Именно так HTTPS ходит через HTTP-прокси.

Может ли прокси читать мой HTTPS-трафик внутри туннеля CONNECT?

Нет. После открытия туннеля TLS согласуется сквозным образом между вашим клиентом и сервером назначения, поэтому прокси видит только шифрованные байты. Имя хоста и порт он видит из строки CONNECT и SNI в TLS, а вот содержимое — нет, если только он не перехватывает TLS сертификатом, которому доверяет ваше устройство.

Почему прокси ограничивают CONNECT портом 443?

Потому что CONNECT открывает произвольный TCP-туннель, и прокси без ограничений мог бы перегонять любой протокол на любой порт и стал бы открытым релеем для злоупотреблений. Ограничение CONNECT портом 443 (иногда ещё коротким белым списком) оставляет его для обычного HTTPS и не даёт туннелировать через прокси посторонние сервисы.

HTTP-прокси, который туннелирует HTTPS

Аутентифицированный HTTP-прокси s4m на порту 3128 обрабатывает CONNECT, поэтому HTTPS остаётся зашифрованным сквозным образом; рядом работает SOCKS5 на 1080. Оплата за потраченное, анонимные аккаунты, принимаем криптовалюту.

Эту страницу нашли по запросу

Реальные поисковые фразы, на которые отвечает эта страница — по ссылкам откроются материалы, раскрывающие тему глубже.