Конвертировать HTTP-прокси в HTTPS-прокси в Twisted - PullRequest
9 голосов
/ 25 июня 2010

Недавно я поиграл с прокси HTTP в витой. После долгих проб и ошибок я думаю, что наконец-то у меня что-то работает. Однако я хочу знать, как, если это возможно, расширить этот прокси-сервер, чтобы он также мог обрабатывать страницы HTTPS? Вот что у меня так далеко:

from twisted.internet import reactor
from twisted.web import http
from twisted.web.proxy import Proxy, ProxyRequest, ProxyClientFactory, ProxyClient



class HTTPProxyClient(ProxyClient):
    def handleHeader(self, key, value):
        print "%s : %s" % (key, value)
        ProxyClient.handleHeader(self, key, value)

    def handleResponsePart(self, buffer):
        print buffer
        ProxyClient.handleResponsePart(self, buffer)

class HTTPProxyFactory(ProxyClientFactory):
    protocol = HTTPProxyClient

class HTTPProxyRequest(ProxyRequest):
    protocols = {'http' : HTTPProxyFactory}

    def process(self):
        print self.method
        for k,v in self.requestHeaders.getAllRawHeaders():
            print "%s : %s" % (k,v)
        print "\n \n"

        ProxyRequest.process(self)

class HTTPProxy(Proxy):

    requestFactory = HTTPProxyRequest


factory = http.HTTPFactory()
factory.protocol = HTTPProxy

reactor.listenSSL(8001, factory)
reactor.run()

Как показывает этот код, сейчас для примера я просто распечатываю все, что происходит через соединение. Можно ли обрабатывать HTTPS с теми же классами? Если нет, то как мне реализовать такую ​​вещь?

Ответы [ 2 ]

13 голосов
/ 06 июля 2010

Если вы хотите подключиться к веб-сайту HTTPS через прокси-сервер HTTP, вам нужно использовать HTTP-глагол CONNECT (потому что именно так работает прокси-сервер для HTTPS). В этом случае прокси-сервер просто подключается к целевому серверу и передает все, что отправлено сервером, обратно в сокет клиента (и наоборот). В этом случае кэширование не используется (но вы можете регистрировать хосты, к которым подключаетесь).

Обмен будет выглядеть так (клиент на прокси):

C->P: CONNECT target.host:443 HTTP/1.0
C->P:

P->C: 200 OK
P->C: 

После этого прокси-сервер просто открывает простой сокет для целевого сервера (пока нет HTTP или SSL / TLS) и передает все между исходным клиентом и целевым сервером (включая квитирование TLS, которое инициирует клиент). Клиент обновляет существующий сокет до прокси-сервера для использования TLS / SSL (путем запуска рукопожатия SSL / TLS). После того как клиент прочитал строку состояния «200», для клиента это выглядит так, как если бы он установил соединение с целевым сервером напрямую.

1 голос
/ 25 июня 2010

Я не уверен насчет скрученного, но хочу предупредить вас, что если вы внедрите HTTPS-прокси, веб-браузер будет ожидать, что SSL-сертификат сервера будет совпадать с именем домена в URL (адресной строке). В противном случае веб-браузер выдаст предупреждения безопасности.

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

...