2014-07-26 4 views
6

Ich verwende FiddlerCore, um HTTP-Anfragen zu erfassen. Alles funktioniert einschließlich SSL Captures, solange das Fiddler-Zertifikat manuell installiert wird. Ich habe die manuelle Installation über das Menü "Optionen" von Fiddler verwendet, und das funktioniert einwandfrei.Wie bekomme ich die programmatische Zertifikatsinstallation von FiddlerCore?

Allerdings, wenn ich die FiddlerCore verwenden, sofern CertMaker Klasse statische Methoden das Fiddler Zertifikat finde ich hinzufügen, dass ich nur in der aktuellen Sitzung das Zertifikat hinzugefügt, um die cert Wurzel verwenden kann. Sobald ich die Anwendung herunterfahre und wieder starte, gibt false zurück.

Ich verwende den folgenden Code, um das Zertifikat für den aktuellen Benutzer (aus einer expliziten Menüoption an diesem Punkt) zu installieren:

public static bool InstallCertificate() 
{ 
    if (!CertMaker.rootCertExists()) 
    { 
     if (!CertMaker.createRootCert()) 
      return false; 

     if (!CertMaker.trustRootCert()) 
      return false; 
    } 

    return true; 
} 

Die cert wird installiert, und ich sehe es im Root-Zertifikat-Store für die aktueller Benutzer Wenn ich SSL-Anfragen in der aktuell laufenden Anwendung aufzeichne, funktioniert es einwandfrei.

Wenn ich jedoch die laufende exe herunterfahren, neu starten und CertMaker.certRootExists() aufrufen, wird false zurückgegeben und wenn ich versuche, SSL-Anfragen zu erfassen, schlägt die SSL-Verbindung im Browser fehl. Wenn ich das Zertifikat neu erstellen und die Anforderungen im Browser erneut ausführen, während die App ausgeführt wird, funktioniert es erneut. Ich habe jetzt zwei Zertifikate im Stammspeicher.

Nach dem Beenden und erneutem Starten certMaker.certRootExists() gibt wieder false zurück. Die einzige Möglichkeit, es zum Laufen zu bringen, ist die Registrierung der cert - exe - Sitzung.

Was mache ich falsch, damit die Installation nicht zwischen der Ausführung der gleichen Anwendung bleibt?

Antwort

12

konnte ich dieses Problem lösen und persistent Zertifikate erstellen, die über EXE-Sitzungen nutzbar sind, indem Sie den Standard CertMaker.dll und BcMakeCert.dll Baugruppen zu entfernen, die FiddlerCore installiert und verwendet und stattdessen die makecert.exe ausführbare Datei zu verteilen.

makecert.exe scheint Zertifikate so zu erstellen, dass sie über mehrere Durchläufe einer Anwendung hinweg verwendbar sind, wobei die enthaltenen Assemblys nur für die laufende Anwendung der aktuellen Anwendung gültig sind.

Update:

Wenn Sie standardmäßig die CertMaker.dll und BcMakeCert.dll die FiddlerCore installiert verwenden möchten, müssen Sie effektiv zwischenzuspeichern und das Zertifikat und den privaten Schlüssel gesetzt, Objekt Fiddlers interne Einstellungen verwenden. Es gibt einige Schlüssel, die das Zertifikat enthalten, nachdem es erstellt wurde, und Sie müssen diese Werte erfassen und in eine Art Konfigurationsspeicher schreiben.

Im folgenden Beispiel habe ich eine statische Konfiguration Objekt, das das Zertifikat und den Schlüssel hält (beharrte auf einer Konfigurationsdatei, wenn die Anwendung heruntergefahren):

public static bool InstallCertificate() 
{ 
    if (!CertMaker.rootCertExists())   
    { 
     if (!CertMaker.createRootCert()) 
      return false; 

     if (!CertMaker.trustRootCert()) 
      return false; 

     // persist Fiddlers certificate into app specific config 
     App.Configuration.UrlCapture.Cert = 
      FiddlerApplication.Prefs.GetStringPref("fiddler.certmaker.bc.cert", null); 
     App.Configuration.UrlCapture.Key = 
      FiddlerApplication.Prefs.GetStringPref("fiddler.certmaker.bc.key", null); 
    } 

    return true; 
} 

public static bool UninstallCertificate() 
{ 
    if (CertMaker.rootCertExists()) 
    { 
     if (!CertMaker.removeFiddlerGeneratedCerts(true)) 
      return false; 
    } 
    // persist Fiddlers certificate into app specific config 
    App.Configuration.UrlCapture.Cert = null; 
    App.Configuration.UrlCapture.Key = null; 
    return true; 
} 

Nachdem ein Zertifikat dieser Code das Zertifikat fängt die Installation und privater Schlüssel in das Konfigurationsobjekt, der diesen Wert später speichert. Zur Deinstallation werden die Werte gelöscht.

Zu Beginn der Anwendung oder zu Beginn des Erfassungsprozesses werden vor dem Aufruf CertMaker.rootCertExists() die Schlüssel aus den Konfigurationswerten gesetzt.Ich tue dies am Anfang meiner Capture Form:

public FiddlerCapture() 
{ 
    InitializeComponent(); 

    // read previously saved Fiddler certificate from app specific config 
    if (!string.IsNullOrEmpty(App.Configuration.UrlCapture.Cert)) 
    { 
     FiddlerApplication.Prefs.SetStringPref("fiddler.certmaker.bc.key", 
               App.Configuration.UrlCapture.Key); 
     FiddlerApplication.Prefs.SetStringPref("fiddler.certmaker.bc.cert", 
               App.Configuration.UrlCapture.Cert); 
    } 
} 

Verwendung dieses Mechanismus zum Speichern und dann die Aufnahmeeinstellungen Einstellung macht die Zertifikate über mehrere EXE-Sitzungen bestehen bleiben, wenn CertMaker.dll verwenden.

Weitere detaillierte Informationen sind verfügbar this detailed blog post on FiddlerCore.

+0

vielen Dank für diese Lösung. Ist es jedoch möglich, dass es nicht für Firefox funktioniert? Wenn ich das mache, muss ich manuell in Firefox FiddlerRoot.cer installieren. Gibt es eine Möglichkeit, dies zu vermeiden? – Cher

+0

Gibt es eine Möglichkeit, den Popup-Dialog zu unterdrücken, der die Installation von cert anzeigt –

0

Wenn noch jemand interessiert ist, fand ich eine einfachere Lösung basierend auf der demo, dass Fiddler bietet. Diese Demo ruft einfach CertMaker.trustRootCert() an und merkwürdigerweise bleibt es haften! Beim ersten Mal werden Sie gefragt, ob Sie das Zertifikat installieren möchten, aber danach gibt die Funktion nur true zurück und das Popup wird nicht angezeigt.

Im Gegensatz zu Ihrem und meinem Programm hält sich das Zertifikat fest, ohne dass Sie sich die Mühe machen müssen, es sich selbst stecken zu lassen, also analysierte ich die Unterschiede mit der Demo. Einer der Unterschiede, die ich bemerkte, war, dass die Demo keinen Verweis auf CertMaker.dll und BCMakeCert.dll hatte. Nachdem ich diese Referenzen aus meiner eigenen Lösung entfernt habe, habe ich das gleiche Verhalten wie die Demo bekommen.

Leider habe ich keine Erklärung, warum das funktioniert, aber ich hoffe, dass dies immer noch einigen Menschen hilft.

+0

Kann dies auch für iOS verwendet werden? – Cosmin

+0

@Cosmin Ich habe es nicht versucht, aber Sie können es leicht überprüfen. Versuchen Sie, die Demo mit und ohne einen Verweis auf CertMaker.dll und BCMakeCert.dll auszuführen. In jedem Fall: (1) Starten Sie die Anwendung, (2) klicken Sie auf "Ja", wenn Sie aufgefordert werden, das Zertifikat zu installieren, (3) schließen Sie die Anwendung und (4) starten Sie die Anwendung erneut, um zu überprüfen, ob das Zertifikat klebt (wenn Sie erneut aufgefordert werden, es klebte nicht). In meinem Fall unter Windows bleibt es haften, wenn beide DLLs fehlen. – Safron

Verwandte Themen