2015-02-13 11 views
5

Attualmente sto programmazione un server proxy utilizzando httplib, e quando tenta di connettersi a HTTPS siti web (come ad esempio Facebook e Google) il mio cliente mi manda "Connect" le richieste che assomigliano a questo:Come rispondere a una richiesta di metodo "CONNECT" in un server proxy utilizzando 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 ha preso un proxy di lavoro da internet e metterlo su, poi annusò la rete su Wireshark, e la risposta a questa richiesta dovrebbe apparire in questo modo:

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

ho notato che il client invia la richiesta al proxy stesso, quindi ho deciso di utilizzare socket e di inviare la risposta al client in questo modo:

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

ho davvero sperato che la gestione tali richieste "CONNECT" sarebbe la soluzione e che il mio server sarà finalmente prendersi cura di richieste HTTPS, ma non lo fa, e i pacchetti di risposta che ho inviare al client don' t appare anche su wireshark.

Quindi le mie domande sono: 1. Che cosa fa realmente il metodo "CONNECT"? 2. Di che altro ho bisogno se non gestendo richieste di metodo "CONNECT" per comunicare con un server HTTPS?

+0

Per l'uso corretto di CONNECT vedere [RFC2817] (https://www.ietf.org/rfc/rfc2817.txt) –

+0

Per la versione tl; dr, 'CONNECT' stabilisce essenzialmente un tunnel tra il client e l'origine server. Sarà necessario utilizzare il multiplexing I/O (ad esempio usando il modulo 'select', o qualcosa come Twisted) per implementarlo correttamente. –

+0

ho fatto lo stesso e ho scoperto che si stava effettivamente tentando l'handshake SSL; ma nel mio caso l'handshake si è fermata a metà strada dopo il saluto del cliente, il server ciao e il certificato del server (scambiando la chiave del server) ... il clinet ha inviato la richiesta di cambio chiave client e modifica cifratura ma sorprendentemente non ha raggiunto il proxy o il proxy mangiato questo messaggio e io sono bloccato lì. se avessi proceduto ulteriormente e implementato il proxy HTTPS, ti dispiacerebbe condividere le tue esperienze su come hai superato il problema che hai menzionato nel post? grazie, Samba – Saasira

risposta

3

Rispondo dopo tanto tempo perché di recente ho lavorato con questo concetto. Può aiutare gli altri.

Per utilizzare il proxy del metodo http CONNECT è necessario creare una connessione socket con la porta https del server (ad esempio 443). Una volta stabilita la connessione, è possibile inviare "Connessione HTTP/1.1 200 stabilita" come risposta.

Dopo che questo client e server comunicano tra loro tramite proxy. Il proxy deve semplicemente trasferire i dati dal socket del client alla presa del server e viceversa. Client e server scambieranno le informazioni sui certificati per l'handshaking, una volta che l'handshake avrà terminato, inizieranno a condividere i dati in formato crittografato in modo che il proxy non sia in grado di capire nulla.

Potrebbe essere utile il seguente codice.

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 

Spero che questa risposta aiuti chiunque ne abbia bisogno. Come ho dovuto passare attraverso un sacco di cose per trovare questa risposta.

+0

Il tuo problema sembra simile al mio: vorresti aiutarmi con la mia domanda? http://stackoverflow.com/questions/36354636/proxy-https-never-receives-data-from-either-client-or-server – elmazzun