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

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

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

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

3 ответов


запрос на подключение побуждает ваш прокси-сервер установить 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

TL; DR веб-клиент использует CONNECT только тогда, когда он знает, что он разговаривает с прокси-сервером, и окончательный URI начинается с https://.

Да я отвечаю после 4 лет. Когда браузер говорит:

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 виноват. Следовательно, это до прокси, чтобы защитить себя от неправильного использования.


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

есть больше деталей, хотя, вероятно, вы хотите прочитать соответствующий RFC-s

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