2015-02-13 12 views
5

ich zur Zeit der Programmierung über einen Proxyserver httplib, und wenn ich versuche, auf HTTPS-Websites (wie Facebook und Google) mein Client sendet mir „CONNECT“ Anforderungen, die wie folgt aussehen zu verbinden:Wie reagiere ich auf eine "CONNECT" -Methode Anfrage in einem Proxy-Server mit Socket in Python?

CONNECT www.google.co.il:443 HTTP/1.1\r\n 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0\r\n 
Proxy-Connection: keep-alive\r\n 
Connection: keep-alive\r\n 
Host: www.google.co.il:443\r\n 
\r\n 

I nahm einen funktionierenden Proxy aus dem Internet und legt sie auf, schnupperte dann das Netzwerk auf wireshark, und die Antwort auf diese Anforderung sollte so aussehen:

HTTP/1.1 200 Connection established\n 
Proxy-agent: Python Proxy/0.1.0 Draft 1\n 
\n 

ich bemerkte, dass der Client die Anforderung an den Proxy sendet selbst, Also entschied ich mich, Socket zu verwenden und die Antwort auf diese Weise an den Client zu senden:

if getmethod(clientreq) is "CONNECT": 
    text="HTTP/1.1 200 Connection established\nProxy-Agent: THE BB Proxy\n\n" 
    client.send(text) 

Ich hatte wirklich gehofft, dass die Lösung, diese „CONNECT“ Anfragen Handhabung wäre und dass mein Server wird schließlich von HTTPS-Anfragen kümmern, aber es funktioniert nicht, und die Antwortpakete, die ich an den Client senden don‘ t sogar auf wireshark erscheinen.

Also meine Fragen sind: 1. Was macht die "CONNECT" -Methode wirklich? 2. Was brauche ich noch, außer die "CONNECT" -Methodenanforderungen zu bearbeiten, um mit einem HTTPS-Server zu kommunizieren?

+0

Für die korrekte Verwendung von CONNECT siehe [RFC2817] (https://www.ietf.org/rfc/rfc2817.txt) –

+0

Für die tl; dr-Version, 'CONNECT' im Wesentlichen einen Tunnel zwischen dem Client und dem Ursprung Server. Sie müssen I/O-Multiplexing verwenden (z. B. mit dem 'select'-Modul oder etwas wie Twisted), um dies korrekt zu implementieren. –

+0

Ich habe das gleiche getan und festgestellt, dass der SSL-Handshake tatsächlich versucht wurde; aber in meinem Fall stoppte der Handshake in der Mitte nach dem Client hallo, Server hallo und Server-Zertifikat (Exchange-Server-Schlüssel) ... die Clinet gesendet Client Key Exchange und Cipher Spec Change-Anfrage aber überraschenderweise nicht erreicht, dass der Proxy oder der Proxy gegessen up diese Nachricht. und ich stecke dort fest. Wenn Sie den HTTPS-Proxy weiter entwickelt und implementiert haben, würden Sie Ihre Erfahrungen darüber, wie Sie das Problem, das Sie in dem Beitrag erwähnt haben, überwunden haben, gerne teilen? danke, Samba – Saasira

Antwort

3

Ich antworte nach dieser langen Zeit, weil ich vor kurzem mit diesem Konzept gearbeitet habe. Es kann anderen helfen.

Um mit CONNECT HTTP-Methode Proxy arbeiten müssen Socket-Verbindung mit dem HTTPS-Port des Servers (ex. 443) erstellen. Sobald die Verbindung hergestellt wurde, können Sie als Antwort "HTTP/1.1 200 Verbindung hergestellt" senden.

Nach diesem Client und Server mit miteinander über Proxy kommunizieren. Proxy muss nur Daten vom Client-Socket zum Server-Socket übertragen und umgekehrt. Client und Server tauschen Zertifikatsinformationen für das Handshaking aus. Sobald das Handshaking abgeschlossen ist, werden die Daten verschlüsselt übertragen, so dass der Proxy nichts mehr versteht.

Möge der folgende Code Ihnen helfen.

def _read_write(self): 
    socs = [self.client, self.target] 
    count = 0 
    while 1: 
     count += 1 
     (recv, _, error) = select.select(socs, [], socs, 3) 
     if error: 
      break 
     if recv: 
      for in_ in recv: 
       data = in_.recv(BUFLEN) 
       if in_ is self.client: 
        out = self.target 
       else: 
        out = self.client 
       if data: 
        out.send(data) 
        print(data) 
        count = 0 
     if count == time_out_max: 
      break 

Ich hoffe, diese Antwort hilft jedem in Not. Da musste ich eine Menge durchgehen um diese Antwort zu finden.

+0

Ihr Problem scheint mir ähnlich: würden Sie mir bei meiner Frage helfen? http://stackoverflow.com/questions/36354636/proxy-https-never-empfangt-data-from-either-client-or-server – elmazzun