2013-01-05 20 views
7

próbuję wdrożyć serwer SSL w-systemie, używając FiddlerCore:SSL otrzymał rekord, który przekroczył maksymalną dozwoloną długość podczas modyfikowania żądania z Skrzypek

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

w Firefox, GET http://localhost:7777/ działa dobrze, ale kiedy i GET https://localhost:7777/, raporty firefox następujący błąd:

SSL received a record that exceeded the maximum permissible length

Dlaczego mam to i jak mogę to naprawić?

AKTUALIZACJA Dzieje się tak tylko wtedy, gdy używam skrzypka jako serwera proxy z firefox. Kiedy usuwam serwer proxy, mogę uzyskać dostęp do https://localhost:7777/. Chciałbym jednak również móc uzyskać dostęp do https://localhost:7777/ za pośrednictwem proxy

+0

Cofnijmy się trochę. Gdy Fiddler * nie jest * ustawiony jako proxy w Firefoksie, czy możesz odwiedzić https: // localhost: 7777? Jaka jest dokładna wersja Firefoksa, której używasz? Czy punkt krytyczny na utilCreateResponseAndBypassServer kiedykolwiek został trafiony? – EricLaw

+0

Używam ff17.0.1. Kiedy odwiedzam 'https: // localhost: 7777' bez serwera proxy, to działa. 'oS.utilCreateResponseAndBypassServer();' zostaje trafiony, a funkcja zwraca odpowiedź do rdzenia skrzypka. –

Odpowiedz

1

Problem w tym scenariuszu jest to, że jesteś przetwarzania ten ruch dwukrotnie:

pierwsze, przeglądarka wysyła połączyć się z portem 8888, mówiąc: „Proszę dać mi tunel TCP/IP na porcie 7777”, a następnie po tym, jak Fiddler mówi: "Dobra, zrobimy to" klient wysyła żądanie HTTPS przez ten tunel do portu 7777.

Problem polega na tym, że wymieniasz tę odpowiedź CONNECT i zwracając HTML zamiast zezwalać na handshake HTTPS z portu 7777 do przepłynięcia.

Najprostszym sposobem rozwiązania tego byłoby zmienić BeforeRequest kod do następujących:

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

Po wykonaniu tej czynności, twój tunel CONNECT nie będzie już coraz zniekształcone i uzgadniania HTTPS uda.

1

Ruch HTTPS jest zaszyfrowany i skrzypek jako serwer proxy debugowania sieci nie może odszyfrować/przeanalizować danych pakietowych wysyłanych przez skrzypek. Używa ataku MITM do odszyfrowania ruchu SSL wysyłanego przez skrzypka, patrz tutaj: http://www.fiddler2.com/fiddler/help/httpsdecryption.asp

Musisz włączyć opcję SSL w skrzypku, a następnie ponownie ją sprawdzić. Jeśli to nie zadziałało, spróbuj podać ręczny certyfikat MITM dla skrzypka.

+0

Skrzypek odszyfrowuje ruch ssl. ale gdy próbuję go zmodyfikować, otrzymuję ten błąd: –

+0

Skrzypek powinien umożliwić modyfikację pakietu i wewnętrznych informacji; Jeśli chcesz. To ma mieć właściwość wtryskiwacza Fiddlera, którą możesz skonfigurować. – Greg

+0

cóż, z mojego doświadczenia wynika, że ​​mogę modyfikować żądania HTTP po prostu dobrze, a na żądania https z tym błędem ulegają –