Convertir HTTP Proxy a HTTPS Proxy en Twisted

Recientemente he estado jugando con el proxy HTTP en retorcido. Después de mucho ensayo y error creo que finalmente tengo algo funcionando. Sin embargo, lo que quiero saber es cómo, si es posible, ¿amplío este proxy para poder manejar las páginas HTTPS? Esto es lo que tengo hasta ahora:

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() 

Como lo demuestra este código, por ejemplo, por ahora solo estoy imprimiendo todo lo que está pasando a través de la conexión. ¿Es posible manejar HTTPS con las mismas clases? Si no es así, ¿cómo debería implementar tal cosa?

Si desea conectarse a un sitio web HTTPS a través de un proxy HTTP, debe usar el verbo HTTP CONNECT (porque así es como funciona un proxy para HTTPS). En este caso, el servidor proxy simplemente se conecta al servidor de destino y retransmite todo lo que el servidor envía de nuevo al socket del cliente (y viceversa). No hay caché involucrado en este caso (pero es posible que pueda registrar los hosts a los que se está conectando).

El intercambio se verá así (cliente a proxy):

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

Después de esto, el proxy simplemente abre un socket plano al servidor de destino (sin HTTP o SSL / TLS todavía) y transmite todo entre el cliente inicial y el servidor de destino (incluido el protocolo de enlace TLS que el cliente inicia). El cliente actualiza el socket existente que tiene al proxy para usar TLS / SSL (iniciando el protocolo de enlace SSL / TLS). Una vez que el cliente ha leído la línea de estado ‘200’, en lo que respecta al cliente, es como si hubiera hecho la conexión al servidor de destino directamente.

No estoy seguro de que haya problemas, pero quiero advertirle que si implementa un proxy HTTPS, un navegador web esperará que el certificado SSL del servidor coincida con el nombre de dominio en la URL (barra de direcciones). El navegador web emitirá advertencias de seguridad de lo contrario.

Hay formas de evitar esto, como generar certificados sobre la marcha, pero necesitaría que el certificado raíz sea confiable en el navegador.