2013-01-05 12 views
7

Sto cercando di implementare un server SSL in-sistema usando FiddlerCore:SSL ha ricevuto un record che ha superato la lunghezza massima consentita quando si modifica richiesta con violinista

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace fiddlerCoreTest 
{ 
    using System.IO; 
    using System.Threading; 
    using Fiddler; 

    class Program 
    { 
     static Proxy oSecureEndpoint; 
     static string sSecureEndpointHostname = "localhost"; 
     static int iSecureEndpointPort = 7777; 

     static void Main(string[] args) 
     { 
      //var tt = Fiddler.CertMaker.GetRootCertificate().GetRawCertData(); 
      //File.WriteAllBytes("root.crt",tt); 

      Fiddler.FiddlerApplication.BeforeRequest += delegate(Fiddler.Session oS) 
      { 
       oS.bBufferResponse = false;    

       if ((oS.hostname == sSecureEndpointHostname)&&oS.port==7777) 
       { 
        oS.utilCreateResponseAndBypassServer(); 
        oS.oResponse.headers.HTTPResponseStatus = "200 Ok"; 
        oS.oResponse["Content-Type"] = "text/html; charset=UTF-8"; 
        oS.oResponse["Cache-Control"] = "private, max-age=0"; 
        oS.utilSetResponseBody("<html><body>Request for httpS://" + sSecureEndpointHostname + ":" + iSecureEndpointPort.ToString() + " received. Your request was:<br /><plaintext>" + oS.oRequest.headers.ToString()); 
       } 
      }; 

      FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default; 
      oFCSF = (oFCSF & ~FiddlerCoreStartupFlags.RegisterAsSystemProxy); 

      Fiddler.FiddlerApplication.Startup(8877, oFCSF); 

      oSecureEndpoint = FiddlerApplication.CreateProxyEndpoint(iSecureEndpointPort, true, sSecureEndpointHostname); 
      if (null != oSecureEndpoint) 
      { 
       FiddlerApplication.Log.LogFormat("Created secure end point listening on port {0}, using a HTTPS certificate for '{1}'", iSecureEndpointPort, sSecureEndpointHostname); 
      } 

      Console.WriteLine("Press any key to exit"); 

      Console.ReadKey(); 
     } 
    } 
} 

in Firefox, GET http://localhost:7777/ funziona bene, ma quando oTTENGO https://localhost:7777/, rapporti firefox seguente errore:

SSL received a record that exceeded the maximum permissible length

Perché ottengo questo, e come posso risolvere il problema?

UPDATE Questo accade solo quando uso il violinista come proxy con firefox. Quando rimuovo il proxy del fiddler, posso accedere a https://localhost:7777/. Tuttavia, vorrei anche poter accedere a https://localhost:7777/ tramite il proxy

+0

Torniamo indietro un po '. Quando Fiddler * non è impostato come proxy in Firefox, è possibile visitare https: // localhost: 7777? Inoltre, qual è la versione esatta di Firefox che stai utilizzando? Viene mai colpito un breakpoint su utilCreateResponseAndBypassServer? – EricLaw

+0

Sto usando ff17.0.1. Quando visito 'https: // localhost: 7777' senza proxy, funziona. 'oS.utilCreateResponseAndBypassServer();' viene colpito, e la funzione restituisce una risposta al nucleo del violinista. –

risposta

1

Il problema in questo scenario è che si sta lavorazione di questo traffico due volte:

In primo luogo, il browser invia una connettersi alla porta 8888 dicendo: "Per favore mi dia un tunnel TCP/IP alla porta 7777" e poi dopo che Fiddler ha risposto "Okay, lo faremo" il client invia una richiesta HTTPS attraverso quel tunnel alla porta 7777.

Il problema qui è che si sta verificando la risposta di CONNECT e si restituisce HTML invece di consentire l'handshake HTTPS dalla porta 7777 per scorrere.

Il modo più semplice per risolvere questo problema sarebbe quello di modificare il codice BeforeRequest al seguente:

if ((oS.hostname == sSecureEndpointHostname) && (oS.port==7777) 
    && !oS.HTTPMethodIs("CONNECT")) { 

Dopo aver fatto questo, il vostro tunnel CONNECT non sarà più ottenere straziati e la stretta di mano HTTPS avrà successo.

1

Il traffico HTTPS è crittografato e il violinista come un proxy del debugger Web non può decodificare/analizzare i dati del pacchetto inviati tramite il violinista. Utilizza un attacco MITM per decrittografare il traffico SSL inviato tramite violinista, vedere qui: http://www.fiddler2.com/fiddler/help/httpsdecryption.asp

Quindi devi abilitare l'opzione SSL nel fiddler, quindi ricontrollare. Se non funziona, prova a fornire un certificato MITM manuale a Fiddler.

+0

Il violinista decrittografa il traffico ssl ok. ma quando sto cercando di modificarlo, sto ricevendo questo errore –

+0

Fiddler dovrebbe consentire di modificare il pacchetto e le informazioni interne; se desideri. Si suppone che abbia la proprietà Injector di Fiddler che è possibile configurare. – Greg

+0

beh, in base alla mia esperienza mi consente di modificare le richieste HTTP con precisione e non riesce su richieste https con questo errore –