C # X509Certificate2.Verify без проверки отзыва - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь использовать функцию X509Certificate2.Verify () для проверки допустимости цепочки сертификатов.Функция Verify возвращает false, а ChainElementStatus возвращает «RevocationStatusUnknown».

Есть ли способ использовать функцию Verify без проверки RevocationStatus?RevocationStatus нельзя проверить без подключения к интернету?Есть ли другая функция для проверки цепочки и сертификатов без RevocationStatus?

Грязное решение - проверить, является ли RevocationStatus единственным элементом в element.ChainElementStatus.

Я уже использую X509RevocationMode.Offline и IgnoreCertificateAuthorityRevocationUnknown.

Код из:1009 * X509Certificate2.Verify () метод всегда возвращает false для действительного сертификата

X509Chain ch = new X509Chain();

ch.Build(certificate);

ch.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
ch.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown;

Console.WriteLine("Chain Information");
Console.WriteLine("Chain revocation flag: {0}", ch.ChainPolicy.RevocationFlag);

Console.WriteLine("Chain revocation mode: {0}", ch.ChainPolicy.RevocationMode);
Console.WriteLine("Chain verification flag: {0}", ch.ChainPolicy.VerificationFlags);
Console.WriteLine("Chain verification time: {0}", ch.ChainPolicy.VerificationTime);
Console.WriteLine("Chain status length: {0}", ch.ChainStatus.Length);
Console.WriteLine("Chain application policy count: {0}", ch.ChainPolicy.ApplicationPolicy.Count);
Console.WriteLine("Chain certificate policy count: {0} {1}", ch.ChainPolicy.CertificatePolicy.Count, Environment.NewLine);

//Output chain element information.
Console.WriteLine("Chain Element Information");
Console.WriteLine("Number of chain elements: {0}", ch.ChainElements.Count);
Console.WriteLine("Chain elements synchronized? {0} {1}", ch.ChainElements.IsSynchronized, Environment.NewLine);

foreach (X509ChainElement element in ch.ChainElements)
{
Console.WriteLine("Element issuer name: {0}", element.Certificate.Issuer);
Console.WriteLine("Element certificate valid until: {0}", element.Certificate.NotAfter);
Console.WriteLine("Element certificate is valid: {0}", element.Certificate.Verify());
Console.WriteLine("Element error status length: {0}", element.ChainElementStatus.Length);
Console.WriteLine("Element information: {0}", element.Information);
Console.WriteLine("Number of element extensions: {0}{1}", element.Certificate.Extensions.Count, Environment.NewLine);

    if (ch.ChainStatus.Length >= 1)
    {
        for (int index = 0; index < element.ChainElementStatus.Length; index++)
        {
            Console.WriteLine(element.ChainElementStatus[index].Status);
            Console.WriteLine(element.ChainElementStatus[index].StatusInformation);
        }
    }
}

Результат:

Информация о цепочке Флаг отзыва цепи: ExcludeRoot Режим отзыва цепи: Флаг проверки автономной цепи: IgnoreCertificateAuthorityRevocationUnknown Время проверки цепочки: 19.11.2018 07:53:31 Длина статуса цепочки: 1 Количество политик цепочки приложений: 0 Количество политик цепочки сертификатов: 0

Информация об элементах цепочки Количество элементов цепочки: 2 синхронизированы элементы цепочки?False

Имя эмитента элемента: CN = TestRootCA Сертификат элемента действителен до: 01.01.2019 00:00:00 Сертификат элемента действителен: Длина состояния ошибки False Element: 1 Информация об элементе: Количество расширений элемента: 5

RevocationStatusUnknown Die Sperrfunktion konnte keine Sperrprüfung für das Zertifikat durchführen.

Имя эмитента элемента: CN = TestRootCA Сертификат элемента действителен до: 01.01.2019 00:00:00 Сертификат элемента действителен: ошибка истинного элементадлина: 0 Информация об элементе: Количество расширений элемента: 2

1 Ответ

0 голосов
/ 19 ноября 2018

Я уже использую X509RevocationMode.Offline и IgnoreCertificateAuthorityRevocationUnknown.

Что означает IgnoreCertificateAuthorityRevocationUnknown: «не заставлять chain.Build возвращать false по этой причине *1006*»

1008

Конечно, вы устанавливаете его после вызова chain.Build и не проверяете возвращаемое значение из chain.Build.

Если вы хотите игнорировать отзыв, установите ChainPolicy.RevocationMode на X509RevocationMode.NoCheck.Если вы хотите, чтобы он был проверен, если он уже был кэширован, и проигнорирован, если это не так, то установка режима в автономный режим и установка всех флагов RevocationUnknown делает это.

Логическое возвращение из chain.Build равно true, еслисертификат / цепочка прошли все проверки достоверности, которые не были помечены как игнорируемые через значение VerificationFlags.

Таким образом, самое короткое «скажи мне, если этот сертификат не истек, имеет разрешаемую цепочку, конец цепочки - это что-тоЯ верю, и мне наплевать на отзыв »- это

using (X509Chain ch = new X509Chain())
{
    ch.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;

    return ch.Build(certificate);
}

Оппортунистический отзыв будет

using (X509Chain ch = new X509Chain())
{
    ch.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
    ch.ChainPolicy.VerificationFlags =
        X509VerificationFlags.IgnoreEndRevocationUnknown |
        X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown |
        X509VerificationFlags.IgnoreRootRevocationUnknown;

    return ch.Build(certificate);
}
...