Convertir le mandataire HTTP en mandataire HTTPS dans Twisted

récemment, j'ai joué avec le Proxy HTTP dans twisted. Après beaucoup d'essais et d'erreurs, je pense que j'ai enfin quelque chose qui fonctionne. Ce que je veux savoir cependant, c'est comment, si c'est possible, est-ce que je développe ce proxy pour pouvoir aussi gérer les pages HTTPS? Voici ce que j'ai obtenu jusqu'à présent:

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

comme ce code le démontre, pour le bien de l'exemple pour l'instant je ne fais qu'imprimer ce qui passe par la connexion. Est-il possible de manipuler des HTTPS avec les mêmes classes? Si non, comment dois-je aller sur la mise en œuvre d'une telle chose?

8
demandé sur themaestro 2010-06-25 18:01:27

2 réponses

si vous souhaitez vous connecter à un site Web HTTPS via un proxy HTTP, vous devez utiliser le verbe HTTP CONNECT (parce que c'est ainsi qu'un proxy fonctionne pour HTTPS). Dans ce cas, le serveur mandataire se connecte simplement au serveur cible et renvoie tout ce qui est envoyé par le serveur à la socket du client (et vice versa). Il n'y a pas de mise en cache dans ce cas (mais vous pourriez être en mesure d'enregistrer les hôtes auxquels vous vous connectez).

l'échange ressemblera à ceci (client à mandataire):

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

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

après cela, le proxy ouvre simplement une socket simple au serveur cible (pas de HTTP ou de SSL/TLS encore) et relaie tout entre le client initial et le serveur cible (y compris la poignée de main TLS que le client initie). Le client met à niveau la socket existante qu'il a au proxy pour utiliser TLS/SSL (en démarrant la poignée de main SSL/TLS). Une fois que le client a lu la ligne de statut '200', en ce qui concerne le client, c'est comme s'il avait fait connexion au serveur cible directement.

12
répondu Bruno 2013-08-25 19:28:27

Je ne suis pas sûr de twisted, mais je tiens à vous prévenir que si vous implémentez un proxy HTTPS, un navigateur Web s'attendra à ce que le certificat SSL du serveur corresponde au nom de domaine dans L'URL (barre d'adresse). Autrement, le navigateur Web émettra des avertissements de sécurité.

il y a des moyens de contourner cela, comme générer des certificats à la volée, mais il faut que le certificat racine soit fiable sur le navigateur.

1
répondu Marcus Adams 2010-06-25 14:40:46