2012-01-30 7 views
0

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

ответ

-1

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

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

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

+0

Да, я думал, что X509Certificate2, сертификат не из веб-запроса, это из файла сертификата. – buda

2

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

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

+0

Вы уверены, что .NET не выполняет проверки отзыва? - У меня возникли проблемы, когда решение не смогло получить доступ к CRL с тестового сервера сертификатов в тестовой среде, но это много лет назад, и я не могу гарантировать, что это не компонент безопасности, который вводится в решение , – faester

+0

Извините: похоже, IIS проверяет отзыв, это, вероятно, то, что я помню. – faester

+0

@faester CrtypoAPI внутренне выполняет проверки CRL и OCSP, но они не легко доступны и управляемы из .NET. –

1

использовать этот API от использования файла x509.h OpenSSL 1.0/или выше версии

X509_CRL_get0_by_cert (X509_CRL * коралл, X509_REVOKED ** RET, X509 * х);

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

1

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

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

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

В принципе, код woul выглядеть следующим образом:

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; 
    } 
} 
+0

Ваш метод с использованием X509CRL2 работал как чемпион. Благодаря!! – JonK

0

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

Я нашел следующий пример кода here. Я тестировал его как для публичных подписей, так и для внутренних сертификатов 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]; 
    } 
} 
Смежные вопросы