2012-01-30 3 views
0

X509Certificate이 취소되면 프로그래밍 방식으로 어떻게받을 수 있습니까? 인증서가 철회되면 정보를 얻을 수 있지만 취소 된 시점을 알아야합니다. CRL 목록에 해당 정보가 있다고 생각하지만 누군가 그 정보를 읽는 방법을 말해 줄 수 있습니까?해지 된 X509Certificate

답변

-1

취소 할 때 무효화 하시겠습니까? 취소 된 경우 웹 서버가 먼저 방해받지 않고 코드의 요청에 도달 할 것으로 기대하지 않습니다.

x509certificate에서 파생 된 x509certificate2를 사용하는 경우 확인할 수있는 더 많은 속성이 있습니다. 아래 링크에는 여러 가지 예가 나와 있습니다.

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

+0

예, X509Certificate2 인증서가 웹 요청에서 온 것이 아니며 인증서 파일에서 가져온 것입니다. – buda

2

폐기 상태는 (a) CRL리스트를 획득하고 인증서가 표시되는지 확인하고, (b)이를 확인하는 서버에 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

사용 x509.h 파일 용도에는 OpenSSL에서이 API 1.0/또는 버전

X509_CRL_get0_by_cert 상기 (X509_CRL CRL *, ** X509_REVOKED RET, 509 * X);

X 인증서를 확인하고 싶습니다.
Ret는 해지 구조의 주소이며 여기서 모두 해지 이유와 이유는 다음과 같습니다.
crl이 CRL입니다.

1

향후 독자를위한 설명입니다.

이미 말했듯이 .NET은 공개 클래스 나 X.509 인증서 해지 목록 또는 OCSP 메시징을 노출하지 않습니다. 물론 자신의 코드를 작성하거나 타사 라이브러리를 사용할 수 있습니다.

PowerShell PKI 모듈 프로젝트 (PKI.Core.dll 라이브러리)에서 내 확장 CryptoAPI 관리를 사용해 볼 수 있습니다. X509 CRL 관리 클래스 (CryptoAPI 기본 함수 위에 구축 됨)에 대한 지원이 있습니다 : X509CRL2 class. RevokedCertificates 속성에는 해지 된 인증서 배열이 저장됩니다. 또한 라이브러리에는 PKI.OCSP 네임 스페이스에 저장된 OCSP 메시징 클래스 (완전 관리)가 포함됩니다. 인증서에 AIA 확장에 OCSP 링크가 포함되어 있으면 OCSPRequest 개체를 인스턴스화하고 OCSPRequest.SendRequest 메서드를 호출하여 X509Certificate2 개체에서 OCSP 요청을 쉽게 만들 수 있습니다. 반환 객체는 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은 인증서가 해지되지 않는다는 것을 의미합니다.CRL이를 X509Certificate 개체의 확장 속성의 OID로 저장됩니다

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

: 코드가이 같이 보일 것이다 X509 CRL과

. OID FriendlyName 및 값은 'CRL 배포 지점'및 '2.5.29.31'입니다. OID가 2.5.29.31 인 인증서의 확장을 검색하면 원시 데이터를 구문 분석하고 배포 지점을 얻을 수 있습니다.

다음 코드 샘플은 here입니다. 필자는 공개적으로 서명 한 인증서와 내부 Microsoft 인증서를 모두 테스트했습니다. 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]; 
    } 
} 
관련 문제