2012-01-30 20 views
0

X509Certificateが取り消されたときに、プログラムでどのように取得できますか?証明書が取り消された場合は情報を得ることができますが、取り消しが必要な場合はCRLリストにその情報があると思いますが、誰かにその情報の読み方を教えてもらえますか?取り消されたX509Certificate

答えて

-1

あなたが取り消しと言うとき、あなたは無効であるとお考えですか?それが取り消された場合、Webサーバーが最初に邪魔になるので、私はそれがあなたのコード内の要求に到達するとは期待しません。

x509certificateから派生したx509certificate2を使用すると、確認できるプロパティがさらに増えます。下のリンクにいくつかの例があります。

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

+0

はい、私はX509Certificate2証明書がWeb要求からではなく、証明書ファイルからのものだと考えました。 – buda

2

失効ステータスが(a)はCRLリストを取得し、証明書がリストされているかどうかをチェックする、および(b)は同じことを確認するため、サーバーへのOCSP要求を送信することによりチェックされています。

.NETではこれを行えません。 CryptoAPIにはこれらの操作のための手段があるかもしれませんが、.NETのサードパーティライブラリを使用するのが最も簡単です。 BouncyCastleはOCSPとCRLをサポートしていると主張しており、SecureBlackboxはOCSPとCRLの完全なサポート(クライアントコンポーネントとサーバーコンポーネントの両方が利用可能)を提供しており、完全な証明書検証(CRLとOCSPのすべてのチェックと必要に応じてHTTPとLDAPの通信)を1つのメソッド呼び出しで実行します。

+0

.NETでrevokationチェックを実行していませんか? - ソリューションがテスト環境のテスト証明書サーバーから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、X509用* 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は、証明書が失効されていないことを意味します。コードはこのようになり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

CRLはX509Certificateオブジェクトの拡張プロパティにOIDとして格納されます。 OID FriendlyNameと値は「CRL配布ポイント」と「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]; 
    } 
} 
関連する問題