2014-07-26 9 views
6

Sto utilizzando FiddlerCore per acquisire richieste HTTP. Tutto funziona, comprese le Cattura SSL finché il certificato Fiddler viene installato manualmente. Ho usato l'installazione manuale tramite il menu Opzioni di Fiddler e questo funziona perfettamente.Come si ottiene l'installazione del certificato programmatico FiddlerCore su "stick"?

Tuttavia, se uso il FiddlerCore fornito metodi statici CertMaker di classe per aggiungere il certificato Fiddler trovo che posso utilizzare il certificato aggiunto alla radice del CERT solo nella sessione corrente. Non appena ho chiuso l'applicazione e riavviato, CertMaker.rootCertExists() restituisce false.

Io uso il seguente codice per installare il certificato per l'utente corrente (da un menu esplicito a questo punto):

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

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

    return true; 
} 

il CERT viene installato e lo vedo nell'archivio principale CERT per la utente attuale. Se acquisisco richieste SSL nell'applicazione attualmente in esecuzione, funziona correttamente.

Tuttavia, se chiudo l'exe in esecuzione, riavvio e chiamo CertMaker.certRootExists() restituisce false e se provo a catturare richieste SSL la connessione SSL non riesce nel browser. Se ricrei il certificato e poi rieseguo le richieste nel browser mentre l'app rimane attiva, funziona di nuovo. Ora finisco con due certificati nell'archivio principale.

Dopo l'uscita e il riavvio, certMaker.certRootExists() restituisce nuovamente false. L'unico modo per farlo funzionare è registrare la sessione certificata.

Cosa sto facendo male perché l'installazione non si attacca tra l'esecuzione della stessa applicazione?

risposta

12

ho potuto risolvere questo problema e creare certificati persistenti che sono utilizzabili tra le sessioni EXE, rimuovendo il difetto CertMaker.dll e BcMakeCert.dll assembly FiddlerCore installati ed utilizzare e distribuire l'eseguibile makecert.exe invece.

makecert.exe sembra creare certificati in modo tale che siano utilizzabili su più esecuzioni di un'applicazione, in cui gli assembly inclusi sono validi solo per la sessione corrente dell'applicazione corrente.

Aggiornamento:

Se si desidera utilizzare il CertMaker.dll e BcMakeCert.dll che FiddlerCore installato per impostazione predefinita, è necessario memorizzare nella cache in modo efficace e impostare il certificato e la chiave privata, utilizzando Fiddlers preferenze interni dell'oggetto. Ci sono un paio di chiavi che contengono il certificato dopo che è stato creato ed è necessario acquisire questi valori e scriverli in una sorta di memoria di configurazione.

Nel seguente esempio ho un oggetto statico di configurazione che contiene il certificato e la chiave (persistito per un file di configurazione quando l'applicazione si spegne):

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

Dopo l'installazione di un certificato di questo codice cattura il certificato e chiave privata nell'oggetto di configurazione che persiste in seguito. Per la disinstallazione, i valori vengono cancellati.

All'inizio dell'applicazione o all'inizio del processo di acquisizione, prima di chiamare CertMaker.rootCertExists() le chiavi vengono impostate dai valori di configurazione.Faccio questo, all'inizio della mia forma di acquisizione:

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

Utilizzando questo meccanismo per il salvataggio e quindi impostando le impostazioni di acquisizione rende i certificati persistono in più sessioni di EXE quando si utilizza CertMaker.dll.

Ulteriori informazioni dettagliate sono disponibili this detailed blog post on FiddlerCore.

+0

grazie mille per quella soluzione. Tuttavia, è possibile che non funzioni per Firefox? Nel fare ciò, ho bisogno di installare manualmente in firefox FiddlerRoot.cer. c'è un modo per evitarlo? – Cher

+0

C'è un modo per sopprimere la finestra di pop-up che mostra di installare cert –

0

Se qualcuno è ancora interessato, ho trovato una soluzione più semplice basata su demo fornita da Fiddler. Questa demo chiama semplicemente CertMaker.trustRootCert(), e stranamente, si attacca! La prima volta chiederà se si desidera installare il certificato, ma successivamente la funzione restituirà true e non farà apparire il pop-up.

A differenza del tuo e del mio programma, il certificato si attacca senza doversi preoccupare di lasciare che si attacchi, quindi ho analizzato le differenze con la demo. Una delle differenze che ho notato è che la demo non aveva un riferimento a CertMaker.dll e BCMakeCert.dll. Dopo aver rimosso questi riferimenti dalla mia soluzione, ho avuto lo stesso comportamento della demo.

Purtroppo, non ho una spiegazione del perché funzioni, ma spero che questo aiuti ancora alcune persone.

+0

Può essere usato anche per iOS? – Cosmin

+0

@Cosmin Non l'ho provato, ma si può facilmente controllare. Prova a eseguire la demo con e senza riferimento a CertMaker.dll e BCMakeCert.dll. In ogni caso: (1) avviare l'applicazione, (2) fare clic su "sì" quando richiesto per installare il certificato, (3) chiudere l'applicazione e (4) avviare nuovamente l'applicazione per verificare se il certificato si attacca (se richiesto di nuovo, non si attaccava). Nel mio caso su Windows, si blocca quando entrambi i dll sono assenti. – Safron

Problemi correlati