2013-02-15 3 views
0

Я создаю прокси-сервер в python, который основан на BaseHTTPServer. Он создает соединение с прокси-сервером squid, идентифицирует запрос браузера (GET, CONNECT, POST и т. Д.) И добавляет к нему заголовок авторизации прокси-сервера, а затем перенаправляет этот запрос на прокси-сервер squid.HTTP Connect запрос через каскадный прокси

Проблема, насколько я понимаю, когда я отправляю запрос на подключение, я должен передать весь соответствующий трафик на прокси-сервер squid. Но, как я могу видеть в wirehark, прокси-сервер squid не отвечает на «Client Hello» часть рукопожатия, которое, я думаю, связано с прокси-сервером squid, который не понимает двоичные данные SSL, которые я только пересылаю.

Как обрабатывать запросы HTTPS в этом случае?

код является более или менее похожи на TinyHTTPProxy: http://www.oki-osk.jp/esc/python/proxy/

ответ

1

RFC 2817 определяет метод CONNECT. Он отличается от других HTTP-методов тем, что получающий прокси (ваш прокси-сервер Python) направлен на установление необработанного туннеля TCP непосредственно на хост-получатель (так называемый авторитет в RFC).

Прокси-сервер не может делать никаких предположений о данных, которые будут отправляться через этот туннель; он не обязательно будет HTTP – клиент может использовать туннель, чтобы говорить любой протокол, который ему нравится. Действительно, SSL HTTP.

У вас есть два варианта:

  • открыть TCP соединение непосредственно к запрашиваемому узлу назначения.
  • Сделайте запрос CONNECT на ваш прокси-сервер (Squid). Это находится в пределах спецификации:

    Возможно, прокси-сервер может обратиться только к запрашиваемому серверу происхождения через другой прокси-сервер . В этом случае первый прокси ДОЛЖЕН сделать запрос CONNECT этого следующего прокси, , запрашивающий у туннеля полномочия. Прокси НЕ ДОЛЖЕН отвечать с любым кодом состояния 2xx, если у него нет прямого или туннельного соединения , установленного для этого органа.

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

    CONNECT www.google.com:443 HTTP/1.1 
    Host: www.google.com:443 
    Proxy-Authorization: ... 
    ​ 
    
+0

Я делаю то же самое. Вот код, который я реализовал: 'PROXY_ADDR = ("172.16.27.25", 3128) #Squid прокси CONNECT = "CONNECT www.gooogle.com:443 HTTP/1.1 \ г \ п" proxy_auth =" Proxy-Authorization: Basic "+ str (encoded_user_pass) +" \ r \ n " CONNECT = CONNECT + proxy_auth +" \ r \ n " s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect (PROXY_ADDR) s.send (CONNECT) ' После этого он инициирует рукопожатие, но не получает ответа от сервера Squid (Server hello). – Polymorph

+0

Я не могу правильно форматировать код выше. В основном, он подключается к прокси-серверу squid (внутренний IP-адрес) и отправляет запрос CONNECT с авторизацией прокси. (который он не работает при рукопожатии) Я использовал прокси-строитель в модуле urllib2, и он отлично работает с прокси-сервером squid, но я не понимаю, почему приведенный выше код не работает. – Polymorph

+0

@Polymorph: вам не хватает заголовка 'Host' в запросе' CONNECT'. [HTTP/1.1 требует] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23), что клиент ДОЛЖЕН включать заголовок 'Host' во всех запросах. – josh3736

Смежные вопросы