HTTPQUERY
Русский

CONNECT

Применение

Запрос CONNECT указывает HTTP-прокси установить TCP-соединение с заданными хостом и портом, а затем передавать необработанные байты в обоих направлениях. Цель запроса задаётся в authority-форме (host:port), а не в виде пути.

Основное применение CONNECT — туннелирование HTTPS. Когда клиенту за прокси нужно обратиться к HTTPS-сайту, последовательность действий такова:

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

Если прокси требует аутентификации, клиент включает в запрос CONNECT заголовок Proxy-Authorization. Отсутствующие или недействительные учётные данные приводят к ответу 407 Proxy Authentication Required.

Стандарт WHATWG Fetch относит CONNECT к запрещённым методам, что не позволяет JavaScript выполнять запросы CONNECT через браузерные API.

В HTTP/2 и HTTP/3 CONNECT создаёт туннель поверх отдельного потока, а не всего TCP-соединения. Спецификация HTTP/2 определяет базовый CONNECT для отдельных потоков. Расширенное обновление протокола CONNECT добавляет псевдозаголовок :protocol, обеспечивающий работу WebSockets и других протоколов поверх мультиплексированного соединения, с поддержкой как в HTTP/2, так и в HTTP/3. Базовый потоковый туннель и расширенный CONNECT дополняют друг друга: первый обеспечивает необработанное туннелирование, второй позволяет использовать не-TCP-протоколы поверх мультиплексированных соединений.

HTTPS-туннель через прокси

Клиент запрашивает TLS-туннель к example.com на порт 443 через прокси. Прокси аутентифицирует клиента с помощью заголовка Proxy-Authorization, открывает TCP-соединение и подтверждает это ответом 200 OK.

Запрос

CONNECT example.com:443 HTTP/1.1
Host: example.com:443
Proxy-Authorization: Basic dXNlcjpwYXNz

Ответ

HTTP/1.1 200 Connection Established

Получив ответ 200, клиент начинает TLS-рукопожатие с example.com через открытый туннель. Прокси передаёт все последующие данные, не проверяя и не изменяя их содержимое.

Туннель без аутентификации

Когда прокси не требует учётных данных, запрос содержит только целевой хост и порт.

Запрос

CONNECT example.com:443 HTTP/1.1
Host: example.com:443

Ответ

HTTP/1.1 200 Connection Established

CORS

CONNECT — запрещённый метод с точки зрения CORS. Браузеры блокируют все попытки отправить CONNECT через браузерные API, такие как fetch() и XMLHttpRequest.

HTTP-туннелирование

HTTP-туннелирование инкапсулирует не-HTTP-трафик внутри HTTP-сообщений, позволяя таким протоколам, как HTTPS, SSH и FTP, проходить через HTTP-прокси. CONNECT — основной механизм установления таких туннелей. Прокси открывает необработанное TCP-соединение с целевыми хостом и портом, а затем передаёт байты в обе стороны, не проверяя их содержимое.

Без прокси между клиентом и сервером CONNECT не нужен. Клиенты подключаются к серверам напрямую по целевому протоколу.

Безопасность

Открытые прокси, принимающие CONNECT к произвольным портам, открывают возможности для злоупотреблений: ретрансляция спама через SMTP (порт 25), сканирование портов внутренних сетей и обход средств контроля сетевого доступа. Промышленные прокси ограничивают CONNECT портом 443 (HTTPS) или белым списком разрешённых назначений.

OWASP считает неограниченный CONNECT угрозой безопасности. Стандарт WHATWG Fetch классифицирует CONNECT как запрещённый метод, не позволяя браузерам отправлять запросы CONNECT напрямую через fetch() или XMLHttpRequest.