Объяснение метода X509Chain.Build () - PullRequest
4 голосов
/ 08 ноября 2011

Я хочу проверить цепочку сертификатов, я получаю коллекцию X509Certificate2 и должен проверить, все ли сертификаты строят одну цепочку.

Обычно, чтобы проверить цепочку сертификатов, я должен взять цифровойподпись из листового сертификата и проверьте, подписан ли он корневым сертификатом - , но в .NET Я не могу найти способ извлечь подпись из объекта X509Certificate2.

Поэтому я подумал об использовании метода X509Chain.Build() следующим образом:

   void ValidateChain(X509Certificate2Collection collection, X509Certificate2 leaf)
    {
        X509Chain x509Chain = new X509Chain();
        x509Chain.ChainPolicy.ExtraStore.AddRange(collection);
        bool isValid = x509Chain.Build(leaf); 
    }

Но у меня есть несколько вопросов о методе сборки:

  1. КакЯ понял, что цепочка была построена также из моего компьютерного магазина, и я хочу, чтобы она строилась только из ExtraStore, как я могу определить это поведение?
  2. Я видел, что после того, как цепочка была построена, она нене содержит корневой сертификат;у меня вопрос почему и как я могу убедиться, что в цепочке есть Root CA, поскольку это не является частью элементов цепочки.

Буду очень признателен, если кто-то сможетобъясните мне, как работает метод Build().

Ответы [ 2 ]

2 голосов
/ 30 июля 2014

Вы должны использовать значение ChainStatus после операции Build.MSDN:

Объект X509Chain имеет глобальный статус ошибки ChainStatus, который следует использовать для проверки сертификата.Правила, регулирующие проверку сертификата, являются сложными, и легко упростить логику проверки, игнорируя состояние ошибки одного или нескольких задействованных элементов.Статус глобальной ошибки учитывает состояние каждого элемента в цепочке.

0 голосов
/ 16 ноября 2011

Попробуйте этот фрагмент кода:

bool chainIsValid = false;

var chain = new X509Chain();
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

chainIsValid = chain.Build(certificate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...