Преобразуйте прокси HTTP в прокси HTTPS в скрученном

Недавно я играл вокруг с Прокси 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 с теми же классами? В противном случае, как я должен пойти о реализации такой вещи?

9
задан themaestro 25 June 2010 в 14:01
поделиться

2 ответа

Если вы хотите подключиться к веб-сайту 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», что касается клиента, это как если бы он напрямую подключился к целевому серверу.

14
ответ дан 4 December 2019 в 13:45
поделиться

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

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

1
ответ дан 4 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: