Как получить установку программного сертификата FiddlerCore на "палку"?

я использую FiddlerCore для захвата HTTP-запросов. Все работает, включая SSL-захваты, пока сертификат Fiddler установлен вручную. Я использую ручную установку через меню опций Fiddler, и это отлично работает.

однако, если я использую предоставленный FiddlerCore CertMaker класс статических методов для добавления сертификата Fiddler я нахожу, что могу использовать сертификат, добавленный в корень сертификата только в текущей сессии. Как только я закрою вниз приложение и начать резервное копирование, CertMaker.rootCertExists() возвращает false.

я использую следующий код для установки сертификата для текущего пользователя (из явной опции меню на данный момент):

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

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

    return true;
}

сертификат устанавливается, и я вижу его в корневом хранилище сертификатов для текущего пользователя. Если я фиксирую SSL-запросы в текущем запущенном приложении, он работает нормально.

однако, если я выключил работающий exe, перезапустите и вызовите CertMaker.certRootExists() он возвращает false, и если я попытка захвата SSL-запросов сбой SSL-соединения в браузере. Если я воссоздаю сертификат, а затем повторно запускаю запросы в браузере, пока приложение работает, оно снова работает. Теперь я получаю два сертификата в корневом хранилище.

после выхода и перезапуска certMaker.certRootExists() снова возвращает значение false. Единственный способ заставить его работать-зарегистрировать сеанс cert-per exe.

что я делаю неправильно, чтобы заставить установку не придерживаться между выполнением того же самого заявление?

2 ответов


я смог решить эту проблему и создать постоянные сертификаты, которые можно использовать в сеансах EXE, удалив значение по умолчанию CertMaker.dll и BcMakeCert.dll сборки, которые fiddlercore устанавливает и использует и распространяет makecert.exe вместо этого исполняемый.

makecert.exe создает сертификаты таким образом, что они могут использоваться в нескольких запусках приложения, где включенные сборки действительны только для текущего сеанса работы приложения.

обновление:

если вы хотите использовать CertMaker.dll и BcMakeCert.dll что fiddlercore устанавливает по умолчанию, вы должны эффективно кэшировать и устанавливать сертификат и закрытый ключ, используя объект внутренних настроек Fiddlers. Есть несколько ключей, которые держат сертификат после его создания, и вам нужно захватить эти значения и записать их в какое-то хранилище конфигурации.

в следующем примере у меня статический объект конфигурации, содержащий сертификат и ключ (сохраняется в файле конфигурации при завершении работы приложения):

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

после установки сертификата этот код захватывает сертификат и закрытый ключ в объект конфигурации, который сохраняет это значение позже. Для удаления значения очищаются.

в начале приложения или в начале процесса захвата, до вызова 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);
    }
}

использование этого механизма для сохранения, а затем установка параметров захвата делает сертификаты сохраняются в нескольких сеансах EXE при использовании CertMaker.файл DLL.

Подробнее это подробное сообщение в блоге на FiddlerCore.


Если кто-то все еще заинтересован, я нашел более простое решение на основе демо что скрипач обеспечивает. Это демо просто называет CertMaker.trustRootCert(), и как ни странно, он прилипает! В первый раз он спросит, хотите ли вы установить сертификат, но после этого функция просто возвращает true и не вызовет всплывающее окно.

В отличие от вашей и моей оригинальной программы, сертификат прилипает без необходимости беспокоиться о том, чтобы позволить ему придерживаться себя, поэтому я проанализировал различия с демо. Одно из отличий я заметил, что демо не было ссылки на CertMaker.dll и BCMakeCert.файл DLL. После удаления этих ссылок из моего собственного решения я получил то же поведение, что и демо.

к сожалению, у меня нет объяснения, почему это работает, но я надеюсь, что это все-таки помогает некоторым людям.