Konvertieren HTTP-Proxy, HTTPS-Proxy Twisted
Vor kurzem habe ich spielen, um mit dem HTTP-Proxy in verdreht. Nach viel Versuch und Irrtum ich glaube, dass ich endlich ich etwas arbeiten. Was ich will zu wissen, obwohl, ist, wie Sie, wenn es möglich ist, tun, erweitere ich diese proxy auch in der Lage sein zu handhaben HTTPS-Seiten? Hier ist, was ich habe, so weit:
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()
Als dieser code veranschaulicht, für den sake des Beispiels für jetzt bin ich nur drucken, was auch immer, die durch die Verbindung. Ist es möglich zu behandeln HTTPS mit den gleichen Klassen? Wenn nicht, wie gehe ich bei der Umsetzung einer solchen Sache?
- Wie wollen Sie behandeln das Thema server-Zertifikat Vertrauen?
- MattH, arbeite ich mit einem weiteren Programmierer für dieses Projekt, und nach ihm hat er bereits herausgefunden, wie man die SSL-cert in twsited. Anscheinend können Sie ausführen: Reaktor.listenSSL(Hafen, Fabrik, cert) und Sie können hören, HTTPS-verbindungen. Obwohl, Sie sind kenntnisreich über das Thema würde ich auf jeden Fall zu schätzen jede Eingabe!
- Wie Marcus Adams Punkte aus. Sie haben die Ausgabe des Zertifikats Vertrauen. Wenn ein webbrowser ist so konfiguriert, einen proxy für HTTPS, sendet er ein "connect host:port" und erwartet, übergeben zu werden,-durch den server. Der proxy eingebunden, sehen nur den verschlüsselten SSL-traffic, es ist die Vermittlung zwischen client und server. Wenn Sie wollte magisch tarnen sich als server zum client, dann würden Sie haben, um den client zu Vertrauen, Ihre Bescheinigung für die Zwecke des Zugriffs auf die website der client versucht, zu besuchen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, um eine Verbindung zu einer HTTPS-Webseite über einen HTTP-proxy, müssen Sie die
CONNECT
HTTP-verb (denn das ist, wie ein proxy funktioniert für HTTPS). In diesem Fall kann der proxy server verbindet zum Zielserver und relais, was gesendet wird vom server zurück an den client-socket (und Umgekehrt). Es ist keine Zwischenspeicherung in den Fall involviert sind (aber vielleicht sind Sie in der Lage, log-hosts, die Sie verbinden sind).Wird der Austausch wie folgt Aussehen (client-proxy):
Danach wird der proxy öffnet einfach eine schlichte Steckdose, um den Ziel-server (ohne HTTP oder SSL/TLS noch nicht) und relais alles, was zwischen dem ersten client und dem Ziel-server (einschließlich der TLS-handshake, dass der client initiiert). Die client-upgrades der vorhandenen Steckdose hat der proxy für die Verwendung von TLS/SSL (durch starten des SSL - /TLS-handshake). Sobald der client hat die '200' status-Zeile, soweit der Kunde ist besorgt, es ist, als ob es gemacht hatte, die Verbindung zum Ziel-server direkt.
Ich bin mir nicht sicher abgedreht, aber ich möchte Sie warnen, dass, wenn Sie implementieren eine HTTPS-proxy, web-browser erwarten, dass der server SSL-Zertifikat mit der domain-name in der URL (Adressleiste). Der web-browser wird Thema Sicherheits-Warnungen sonst.
Gibt es Möglichkeiten, um dieses, wie die Erzeugung von Zertifikaten auf die fliege, aber man muss das root-Zertifikat Vertrauen auf den browser.