如何让FiddlerCore程序化证书安装"坚持"?

Ric*_*ahl 7 ssl https fiddler fiddlercore

我正在使用FiddlerCore来捕获HTTP请求.只要手动安装Fiddler证书,一切都在运行,包括SSL Captures.我一直在通过Fiddler的选项菜单使用手动安装,并且工作正常.

但是,如果我使用FiddlerCore提供的CertMaker类静态方法来添加Fiddler证书,我发现我只能在当前会话中使用添加到cert根目录的证书.一旦我关闭应用程序并开始备份,就CertMaker.rootCertExists()返回false.

我使用以下代码为当前用户安装证书(此时从显式菜单选项):

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

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

    return true;
}
Run Code Online (Sandbox Code Playgroud)

证书已安装,我在当前用户的根证书库中看到它.如果我在当前运行的应用程序中捕获SSL请求,它可以正常工作.

但是,如果我关闭正在运行的exe,重新启动并调用CertMaker.certRootExists()它将返回false,如果我尝试捕获SSL请求,则SSL连接将在浏览器中失败.如果我重新创建证书,然后在应用程序保持运行时在浏览器中重新运行请求,它将再次运行.我现在最终在根存储中有两个证书.

退出并重新启动后certMaker.certRootExists()再次返回false.让它工作的唯一方法是注册证书 - 每个exe会话.

我做错了导致安装在同一个应用程序的执行之间没有问题?

Ric*_*ahl 11

通过删除FiddlerCore安装并使用和分发可执行文件的默认CertMaker.dllBcMakeCert.dll程序集,我能够解决此问题并创建可在EXE会话中使用的持久性证书makecert.exe.

makecert.exe 似乎以这样的方式创建证书,即它们可以在应用程序的多个运行中使用,其中包含的程序集仅对当前应用程序的运行会话有效.

更新:

如果你想使用CertMaker.dllBcMakeCert.dll那FiddlerCore默认安装,你必须有效地高速缓存,并设置证书和私钥,使用提琴手内部优先对象.在创建证书后,有几个密钥保存证书,您需要捕获这些值,并将其写入某种配置存储.

在下面的示例中,我有一个静态配置对象,其中包含证书和密钥(在应用程序关闭时保持为配置文件):

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;
}
Run Code Online (Sandbox Code Playgroud)

安装证书后,此代码会将证书和私钥捕获到配置对象中,该配置对象稍后会保留该值.对于卸载,将清除值.

在应用程序开始或捕获过程开始时,在调用之前,CertMaker.rootCertExists()从配置值设置密钥.我在捕获表单的开头执行此操作:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用CertMaker.dll时,使用此机制保存然后设置捕获设置会使证书在多个EXE会话中保持不变.

有关详细信息,请参阅FiddlerCore上的详细博客文章.