Как получить установку программного сертификата 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.
Если кто-то все еще заинтересован, я нашел более простое решение на основе демо что скрипач обеспечивает. Это демо просто называет CertMaker.trustRootCert()
, и как ни странно, он прилипает! В первый раз он спросит, хотите ли вы установить сертификат, но после этого функция просто возвращает true и не вызовет всплывающее окно.
В отличие от вашей и моей оригинальной программы, сертификат прилипает без необходимости беспокоиться о том, чтобы позволить ему придерживаться себя, поэтому я проанализировал различия с демо. Одно из отличий я заметил, что демо не было ссылки на CertMaker.dll и BCMakeCert.файл DLL. После удаления этих ссылок из моего собственного решения я получил то же поведение, что и демо.
к сожалению, у меня нет объяснения, почему это работает, но я надеюсь, что это все-таки помогает некоторым людям.