X509Certificate2.Verify () поведение при первом использовании - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю над тестом, где я использую сертификаты. У меня есть следующий код, где я проверяю .dll в папке и посмотреть, есть ли у них сертификат. Если они это делают и они проверены, я добавляю их в список сборок:

var files = Directory.EnumerateFiles(directory, "*.dll", SearchOption.AllDirectories);
foreach (var file in files)
{
   try
   {
       var cert = new X509Certificate2(X509Certificate.CreateFromSignedFile(file));
       if (cert.IsNull() || !cert.Verify() || !PUBLIC_KEY.Equals(cert.GetPublicKeyString()))
       {
          cert.Dispose();
          continue;
       }

       cert.Dispose();

       assemblies.Add(Assembly.LoadFrom(file));
   }
   catch (CryptographicException)
   {
     // dll not signed
   }
}

Но странно то, что если компьютер не подключен к Интернету, он не добавит .dll к моим сборкам. Но если он подключен к Интернету, и я запускаю свой тест, все DLL с сертификатом добавляются в мой список сборок. Также после отключения мой тест все еще будет работать. Так что требуется одноразовое подключение к интернету. Я думаю, что это как-то связано с функцией Verify ().

Есть ли способ не иметь это первое подключение к интернету? Я хочу запустить свой тест на компьютерах без подключения к интернету. Я нуб с сертификатами, поэтому не знаю, как это исправить.

1 Ответ

0 голосов
/ 05 сентября 2018

Согласно документации X509Certificate2.Verify() это Performs a X.509 chain validation using basic validation policy.

(Базовая) политика проверки цепочки имеет много свойств, которые сообщают, как должна быть построена цепочка и как должны проверяться сертификаты в цепочке. В вашем случае это значение по умолчанию X509ChainPolicy.RevocationMode свойство, которое установлено на Online. Это причина того, что X509Cerificate2.Verify () не работает без подключения к Интернету. Если вы включите журнал CAPI2 в журналах событий, вы должны увидеть, что было сделано, и что информация об отзыве недоступна или промежуточный сертификат CA не может быть получен.

Вы можете использовать класс X509Chain, где можно установить собственную политику проверки и метод X509Chain.Build(X509Certificate2) для проверки сертификата из dll. Затем проверьте X509Chain.ChainElements для получения информации об ошибке, как показано в примере здесь

Или вы можете использовать собственный метод WinVerifyTrust. Этот метод используется окнами для проверки подписи DLL. Вы можете найти пример здесь . Это ИМХО правильный способ проверить подпись dll (хотя бы на windows).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...