Когда следует использовать методы CONNECT и GET HTTP на прокси-сервере HTTP?

Я создаю библиотеку WebClient. Теперь я реализую функцию прокси, поэтому я провожу некоторые исследования и увидел код, использующий метод CONNECT для запроса URL-адреса.

Но проверяя это в моем веб-браузере, он не использует метод CONNECT, а вместо этого вызывает метод GET.

Так что я в замешательстве. Когда я должен использовать оба метода?


person Alexsandro    schedule 28.07.2012    source источник


Ответы (4)


Запрос CONNECT побуждает ваш прокси установить HTTP-туннель к удаленной конечной точке. Обычно он используется для соединений SSL, хотя его можно использовать и с HTTP (используется для объединения прокси-серверов и туннелирования).

CONNECT www.google.com:443 

Приведенная выше строка открывает соединение вашего прокси-сервера с www.google.com через порт 443. После этого контент, отправляемый клиентом, перенаправляется прокси-сервером на www.google.com:443.

Если пользователь пытается получить страницу http://www.google.com, прокси-сервер может отправить точно такой же запрос и получить ответ для его, от его имени.

При использовании SSL (HTTPS) только две удаленные конечные точки понимают запросы, и прокси-сервер не может их расшифровать. Следовательно, все, что он делает, это открывает этот туннель с помощью CONNECT и позволяет двум конечным точкам (веб-серверу и клиенту) напрямую общаться друг с другом.

Связывание прокси-серверов:

Если вы соединяете 2 прокси-сервера, это последовательность запросов, которые должны быть отправлены.

GET1 is the original GET request (HTTP URL)
CONNECT1 is the original CONNECT request (SSL/HTTPS URL or Another Proxy)

User Request ==CONNECT1==> (Your_Primary_Proxy ==CONNECT==> AnotherProxy-1 ... ==CONNECT==> AnotherProxy-n) ==GET1(IF is http)/CONNECT1(IF is https)==> Destination_URL
person Anirudh Ramanathan    schedule 28.07.2012
comment
Итак, вы сказали мне, что метод CONNECT ограничивает запросы HTTPS (порт по умолчанию 443)? - person Alexsandro; 28.07.2012
comment
Нет, совсем нет. SSL может работать на другом порту. Порт 443 является наиболее часто используемым портом для SSL. CONNECT используется для принудительного проксирования HTTPS-запросов, и его использование для HTTP также возможно, но не обязательно. - person Anirudh Ramanathan; 28.07.2012
comment
Отлично, теперь, если я хочу реализовать цепочку прокси? Клиент -> ПРОКСИ -> Другой ПРОКСИ -> URL. Должен ли я использовать CONNECT или GET? - person Alexsandro; 28.07.2012
comment
Смотрите обновленный ответ. Сначала вы должны последовательно выполнить CONNECT для каждого прокси, к которому вы подключаетесь. Когда вы получите ответ 200 Established от каждого прокси, который вы связываете, наконец, отправьте исходный GET или CONNECT. - person Anirudh Ramanathan; 28.07.2012
comment
Таким образом, мы можем сказать, что CONNECT обычно используется для соединений SSL и цепочки прокси. Хороший! Буду тестировать, заранее спасибо. - person Alexsandro; 28.07.2012
comment
@AnirudhRamanathan, который запускает этот запрос на подключение (клиент или прокси-сервер), например: на моем мобильном устройстве Android я подключен к прокси-серверу, и мое приложение использует HTTPUrlConenction для отправки запроса https на домен/путь я запросил запрос на получение. как соединение будет между ними, не могли бы вы объяснить этот сценарий? - person Aman Jain; 15.07.2017
comment
Для каждого HTTP-запроса всегда ли браузер запускает CONNECT перед другими методами HTTP? - person variable; 13.05.2020

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
comment
Спасибо за подробный ответ, он кое-что подтвердил для меня. - person badsyntax; 19.08.2019
comment
Это первое объяснение, которое я нашел где-либо в Интернете, которое действительно помогло мне понять, когда используется CONNECT и почему. Спасибо! - person MikeSchinkel; 22.02.2021

Как правило, GET используется для простого HTTP и CONNECT для HTTPS.

Однако есть более подробная информация, поэтому вы, вероятно, захотите прочитать соответствующие RFC-ы.

http://www.ietf.org/rfc/rfc2068.txt http://www.ietf.org/rfc/rfc2817.txt

person anttix    schedule 28.07.2012
comment
Спасибо @anttix, на самом деле я просто делаю тест, я видел метод CONNECT, используемый, когда я запрашиваю URL-адрес HTTPS. Теперь я тестирую цепочку прокси, разговаривая с DarkXphenomenon выше, метод CONNECT поможет мне сделать цепочку прокси с помощью CONNECT, потому что GET не работает. - person Alexsandro; 28.07.2012

Метод CONNECT преобразует соединение запроса в прозрачный туннель TCP/IP, обычно для облегчения связи с шифрованием SSL (HTTPS) через незашифрованный прокси-сервер HTTP.

person Community    schedule 13.04.2021