Отзыв X509Сертификат - PullRequest
       96

Отзыв X509Сертификат

1 голос
/ 31 января 2012

Как получить программным способом, когда сертификат X509 отозван?Я могу получить информацию, если сертификат отозван, но мне нужно получить информацию об отзыве, я думаю, что в списке CRL есть эта информация, но может кто-нибудь сказать мне, как это прочитать.

Ответы [ 7 ]

2 голосов
/ 31 января 2012

Состояние отзыва проверяется путем (а) получения списков CRL и проверки наличия там сертификата, и (б) отправки запроса OCSP на сервер для проверки того же самого.

.NET не позволяет вам сделать это. CryptoAPI может иметь некоторые средства для этих операций, но проще всего использовать стороннюю библиотеку для .NET. BouncyCastle утверждает, что имеет некоторую поддержку OCSP и CRL, и наш SecureBlackbox обеспечивает полную поддержку (доступны как клиентские, так и серверные компоненты) для OCSP и CRL, а также мы предоставляем компонент, который выполняет полную проверку сертификатов (со всеми проверками CRL и OCSP и HTTP и LDAP связь при необходимости) одним вызовом метода.

1 голос
/ 30 ноября 2016

CRL хранится в виде OID в свойстве extensions объекта X509Certificate. OID FriendlyName и Value - это «Точки распространения CRL» и «2.5.29.31». Поиск в расширениях сертификата OID со значением 2.5.29.31 позволяет проанализировать необработанные данные и получить точки распространения.

Я нашел следующий пример кода здесь . Я проверил его как на общедоступных сертификатах, так и на внутренних сертификатах Microsoft CA; возвращает строку соединения URL или LDAP.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace System.Security.Cryptography.X509Certificates
{
    public static class X509Certificate2Extensions
    {
        /// <summary>
        /// Returns an array of CRL distribution points for X509Certificate2 object.
        /// </summary>
        /// <param name="certificate">X509Certificate2 object.</param>
        /// <returns>Array of CRL distribution points.</returns>
        public static string[] GetCrlDistributionPoints(this X509Certificate2 certificate)
        {
            X509Extension ext = certificate.Extensions.Cast<X509Extension>().FirstOrDefault(
                e => e.Oid.Value == "2.5.29.31");

            if (ext == null || ext.RawData == null || ext.RawData.Length < 11)
                return EmptyStrings;

            int prev = -2;
            List<string> items = new List<string>();
            while (prev != -1 && ext.RawData.Length > prev + 1)
            {
                int next = IndexOf(ext.RawData, 0x86, prev == -2 ? 8 : prev + 1);
                if (next == -1)
                {
                    if (prev >= 0)
                    {
                        string item = Encoding.UTF8.GetString(ext.RawData, prev + 2, ext.RawData.Length - (prev + 2));
                        items.Add(item);
                    }

                    break;
                }

                if (prev >= 0 && next > prev)
                {
                    string item = Encoding.UTF8.GetString(ext.RawData, prev + 2, next - (prev + 2));
                    items.Add(item);
                }

                prev = next;
            }

            return items.ToArray();
        }

        static int IndexOf(byte[] instance, byte item, int start)
        {
            for (int i = start, l = instance.Length; i < l; i++)
                if (instance[i] == item)
                    return i;

            return -1;
        }

        static string[] EmptyStrings = new string[0];
    }
}
1 голос
/ 27 октября 2014

Для будущих читателей.

Как уже было сказано, .NET в настоящее время не предоставляет открытые классы ни для списков отзыва сертификатов X.509, ни для обмена сообщениями OCSP.Конечно, вы можете написать свой собственный код или использовать сторонние библиотеки.

Вы можете попробовать мои собственные управляемые расширения CryptoAPI из PowerShell PKI проекта модуля (библиотека PKI.Core.dll).Существует поддержка управляемого класса C509 CRL (построенного на основе собственных функций CryptoAPI): X509CRL2 class .Свойство RevokedCertificates хранит массив отозванных сертификатов.Кроме того, библиотека включает в себя классы обмена сообщениями OCSP (полностью управляемые), хранящиеся в пространстве имен PKI.OCSP.Если ваш сертификат содержит ссылки OCSP в расширении AIA, вы можете легко создать запрос OCSP из объекта X509Certificate2, создав экземпляр объекта OCSPRequest и вызвав метод OCSPRequest.SendRequest .Возвращаемый объект является экземпляром класса OCSPResponse .

По сути, код выглядит так:

using System;
using System.Security.Cryptography.X509Certificates;
using PKI.OCSP;

public class Class1 {
    public static DateTime? GetrevocationDate(X509Certificate2 cert) {
        OCSPRequest request = new OCSPRequest(cert);
        OCSPResponse response = request.SendRequest();
        if (response.Responses[0].CertStatus == CertificateStatus.Revoked) {
            return response.Responses[0].RevocationInfo.RevocationDate;
        }
        return null;
    }
}

NULL будет означать, что сертификат не аннулирован.

с X509 CRL код будет выглядеть так:

using System;
using System.Security.Cryptography.X509Certificates;

public class Class1 {
    // crlRawData could a type of System.String and pass the path to a CRL file there.
    public static DateTime? GetrevocationDate(X509Certificate2 cert, Byte[] crlRawData) {
        X509CRL2 crl = new X509CRL2(crlRawData);
        X509CRLEntry entry = crl.RevokedCertificates[cert.SerialNumber];
        if (entry != null) {
            return entry.RevocationDate;
        }
        return null;
    }
}
1 голос
/ 09 мая 2012

используйте этот API из файла x509.h, используйте openssl 1.0 или более позднюю версию

X509_CRL_get0_by_cert (X509_CRL * crl, X509_REVOKED ** ret, X509 * x);

X в сертификатеВы хотите проверить;
Ret - это адрес структуры отзыва, где причиной отзыва и всем сохраненным
crl является CRL.

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

Первым шагом является извлечение точек распространения CRL из сертификата, а затем сопоставление серийного номера сертификата с содержимым CRL из точки распространения.

Вот альтернативный способ извлечения точек распространения CRL с меньшим количеством магических чисел и небольшим переворотом. (протестировано в .NET Core 2.1)

var path = "<path to signed file>";
// get certificate
var cert = new X509Certificate2(path);
// extract the CRL distribution points information
var crlInfo = cert.Extensions["2.5.29.31"];
var crlDistribitionPoints = new AsnEncodedData(crlInfo.Oid, crlInfo.RawData).Format(false);
Console.Writeline(crlDistribitionPoints);    
0 голосов
/ 31 января 2012

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

Если вы используете x509certificate2, который является производным от сертификата x509, тогда у вас естьнамного больше свойств, которые вы можете проверить;Есть несколько примеров по ссылке ниже.

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx

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