Заставить cURL использовать GET на прокси для HTTP-запросов
Я пытаюсь использовать прямой прокси-сервер (Apache Traffic Server или Squid) на своей локальной машине в качестве локального HTTP-кэша для моих вызовов cURL.
Я настроил прокси используя:
curl_setopt($ch, CURLOPT_PROXY, 'http://localhost:8080');
Когда я запрашиваю сайт HTTP, cURL выполняет стандартный HTTP GET
запрос прокси, который может быть правильно кэширован:
GET http://example.com/ HTTP/1.1
Однако при запросе веб-сайта HTTP, cURL выполняет CONNECT
вместо этого, эффективно используя прокси в качестве TCP-туннеля, и предотвращая его кэширование ответа:
CONNECT example.com:80 HTTP/1.1
Есть ли способ заставить CURL выполнить GET
запросить даже для HTTP-сайтов?
Я могу понять причину использования туннеля TCP для запросов HTTP через прокси-сервер HTTP для безопасности, но поскольку мой прокси-сервер находится на локальном хосте, мне все равно, использовать небезопасное соединение HTTP с прокси-сервером, и я хотел бы, чтобы cURL выполнил GET
запрос:
GET https://example.com/ HTTP/1.1
Я пытался с помощью:
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, false);
Но это ничего не изменило.
2 ответа
Я не верю, что это можно сделать, используя некоторые общие настройки конфигурации на стороне клиента, поскольку это отрицает всю цель HTTPS (что никто не может подслушивать ваш HTTPS-трафик).
Таким образом, единственный вариант - настроить прокси-сервер для создания атаки типа "человек посередине" для дешифрования проходящего через него HTTPS-трафика. Прокси-сервер Squid должен поддерживать это, используя функцию "Удар SSL". Для этого есть хорошее введение в эту вики и другие документы по настройке здесь.
В этом режиме squid делает то, что он получает адрес удаленного сервера от клиента CONNECT
запрос и вместо того, чтобы просто создать слепой туннель к серверу, он запускает новый прямой HTTPS-запрос к серверу и сохраняет ответ. Таким образом, Squid имеет доступ ко всему трафику и может кешировать его или делать все, что Squid может с ним делать.
При отправке ответов обратно клиенту он сам должен представить сертификат HTTPS (клиент ожидает трафик HTTPS), поэтому в Squid есть функция автоматической генерации сертификатов для всех проксируемых доменов. Для его настройки вам необходимо создать локальный центр сертификации. Обратите внимание, что эти автоматически сгенерированные сертификаты будут простыми самозаверяющими сертификатами, поэтому на стороне клиента это будет выглядеть как ненадежные сертификаты, и вам нужно будет отключить одноранговую проверку (CURLOPT_SSL_VERIFYPEER = false
).
Я не смог найти подобную функцию на сервере трафика Apache. Кажется, они поддерживают только SSL-терминацию в режиме обратного прокси.
Последнее замечание: пожалуйста, имейте в виду, что это все же скорее взлом, и расшифровка HTTPS может привести к юридическим или этическим проблемам. Никогда не делайте этого без согласия клиентов!
Я не думаю, что другие ответы здесь понимают, что вы хотите сделать. Но это возможно.
Вы хотите сделать запрос https и выполнить его следующим образом:
client <--http--> cache <--https--> remote server
Таким образом, вы небезопасно отправляете запрос https через http в вашей локальной сети, в локальный кеш, а затем кеш надежно извлекает его как https через открытый интернет.
Для этого вам нужно просто взломать первый прыжок. Ваша клиентская программа делает простой http-запрос в кэш, но добавляет заголовок, который говорит, что преобразовать в https при следующем переходе, например:
x-use-protocol: https
Придумайте любой заголовок, который вам нравится. Чтобы это работало, клиент и кэш должны понимать этот заголовок, чтобы преобразование происходило. Это не хорошо для общего просмотра веб-страниц - или в любое время, когда вы не можете контролировать клиента. Но это хороший ответ, если вы пишете и клиент, и кеш.