2015-02-13 1 views
5

я в настоящее время программирование прокси-сервер с помощью HTTPLIB, и когда я пытаюсь подключиться к HTTPS веб-сайтов (например, Facebook и Google) мой клиент посылает мне «CONNECT» запросы, которые выглядят следующим образом:Как я могу ответить на запрос метода CONNECT на прокси-сервере, используя сокет в python?

CONNECT www.google.co.il:443 HTTP/1.1\r\n 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0\r\n 
Proxy-Connection: keep-alive\r\n 
Connection: keep-alive\r\n 
Host: www.google.co.il:443\r\n 
\r\n 

I взял рабочий прокси из интернета и поставить его, затем понюхал сеть на Wireshark, и ответ на этот запрос должен выглядеть так:

HTTP/1.1 200 Connection established\n 
Proxy-agent: Python Proxy/0.1.0 Draft 1\n 
\n 

Я заметил, что клиент посылает запрос на сам прокси-сервер, поэтому я решил использовать сокет и отправить ответ клиенту таким образом:

if getmethod(clientreq) is "CONNECT": 
    text="HTTP/1.1 200 Connection established\nProxy-Agent: THE BB Proxy\n\n" 
    client.send(text) 

Я очень надеялся, что обработка этих «CONNECT» запросы будет решением, и что мой сервер будет, наконец, заботиться о запросах HTTPS, но это не делает, и ответные пакеты, которые я посылаю к клиенту дона» t даже появляются на проводах.

Итак, мои вопросы: 1. Что действительно делает метод «CONNECT»? 2. Что еще мне нужно, кроме обработки запросов метода «CONNECT» для связи с серверами HTTPS?

+0

Для правильного использования CONNECT см. [RFC2817] (https://www.ietf.org/rfc/rfc2817.txt) –

+0

Для версии tl; dr 'CONNECT' по существу устанавливает туннель между клиентом и источником сервер. Вам необходимо будет использовать мультиплексирование ввода-вывода (например, используя модуль 'select' или что-то вроде Twisted), чтобы реализовать это правильно. –

+0

Я сделал то же самое и обнаружил, что квитирование SSL действительно пыталось; но в моем случае рукопожатие прекратилось на полпути после приветствия клиента, приветствия сервера и сертификата сервера (обмен ключа сервера) ... клиенту был отправлен запрос на изменение ключа клиента и шифрования SQL, но удивительно, что он не дошел до прокси-сервера или прокси-сервера это сообщение. и я застрял там. Если бы вы продвинулись дальше и внедрили прокси-сервер HTTPS, не могли бы вы поделиться своим опытом о том, как вы преодолели проблему, о которой упоминалось в сообщении? спасибо, Samba – Saasira

ответ

3

Я отвечаю после этого долгое время, потому что я недавно работал с этой концепцией. Это может помочь другим.

Для работы с прокси-сервером CONNECT http необходимо создать соединение сокета с портом https сервера (например, 443). После установления соединения вы можете отправить «HTTP/1.1 200 Connection установлено» в качестве ответа.

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

Может использоваться следующий код.

def _read_write(self): 
    socs = [self.client, self.target] 
    count = 0 
    while 1: 
     count += 1 
     (recv, _, error) = select.select(socs, [], socs, 3) 
     if error: 
      break 
     if recv: 
      for in_ in recv: 
       data = in_.recv(BUFLEN) 
       if in_ is self.client: 
        out = self.target 
       else: 
        out = self.client 
       if data: 
        out.send(data) 
        print(data) 
        count = 0 
     if count == time_out_max: 
      break 

Надеюсь, что этот ответ поможет любому, кто в этом нуждается. Как мне пришлось пройти через многое, чтобы найти этот ответ.

+0

Ваша проблема кажется похожей на мою: вы поможете мне с моим вопросом? http://stackoverflow.com/questions/36354636/proxy-https-never-receives-data-from-either-client-or-server – elmazzun

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