2012-02-23 10 views
1

私のアプリケーションには証明書(X509Certificate2)があり、すべての証明書の拡張子を列挙できます。これらの拡張機能の1つは、OID 2.5.29.32の証明書ポリシーです。この拡張はOIDのシーケンスであると考えられており、そこで特定のOIDを検索する必要があります。問題は、この拡張がDERオクテット文字列としてコード化されていることです。私が興味を持っている内部のOIDにどうやって行くことができますか?手動でDERオクテット文字列を解析する必要がありますか?どうやってやるの?"証明書ポリシー"の拡張子を解析する

EDIT:Bouncy Castleが提供しているものを見ていきますが、.NETフレームワークに対応したソリューションがあるかどうかは疑問です。フレームワークは証明書やその他のDER構造を解析するので、DERデコーダが組み込まれている可能性があります。

BOUNTY:私は解決策を見つけましたが、改善を探しています。それが関連性の高い順、以下の一つ以上を満たす場合バウンティは、他のソリューションに行く:

  1. それが弾む城(より小さい、成熟または実績のあるソースコードやライブラリを使用しています
  2. 標準の.NETライブラリ関数を使用していますバウンティは今日期限切れになった:私は、それは単に私がふさわしい

BUMPを見つける問題で、私はすでに持っているコードに向上

  • )のみ、すべての残りの部分を解析していない必要があります。答えが他にない場合、GalacticJelloに行きます。

  • 答えて

    1

    1年前にこの問題が発生しました。 私を助けてくれた小さなライブラリが見つかりました(site)。このライブラリはxmlのファイルキー(.exeを使用)を変換し、C#で読み込むことができます。

    XMLでキーを変換するのが好きではありませんでした。私はプロジェクトのオープンソースコードを使用するために図書館の開発者に頼んだが、幸いにも彼は受け入れた。だから私は正確に私が必要としたforkを作った。

    私は長い間、Monoプロジェクトで別の実装を見つけました。利用可能なのは hereです。

    CryptoLib here使用するヘルパークラスと、ここでの例:

    public IRegistryService Connect(String name, RSACryptoServiceProvider privateKey, X509Certificate2 acsCertificate) { 
        if ((String.IsNullOrEmpty(name)) || (acsCertificate == null) || (privateKey == null)) 
        throw new ArgumentException("...."); 
    
        if (!String.IsNullOrEmpty(this.Credential.identifier)) 
        throw new ACSLoginFailureException("...."); 
    
        byte[] challenge = this.acs.getChallenge(name);  
        byte[] answer = new byte[0]; 
        try { 
        answer = Crypto.GenerateAnswer(challenge, privateKey, acsCertificate); 
        } 
        catch (CryptographicException e) { 
        throw new ACSLoginFailureException("....", e); 
        } 
    
        bool connect = this.acs.loginByCertificate(name, answer, out this.credential, out leaseTime);  
    
        // ... 
    } 
    
    +0

    Ah Mono。私は彼らが既存の機能をクローンするだけだと思っていましたが、明らかにそれも拡張しています。 – Dialecticus

    +0

    両方のリンクがあなたのソリューションではすでに死んでいます。あなたの答えを編集してコードとしてここに含めてください。 –

    +0

    こんにちは@ChrisBenard私はあなたのためのコードを更新しました – Makah

    2

    これは私がそれを行った方法です(ただし、以下のアップデートも参照してください)。 Bouncy Castleは、ASN.1 DERの解析に使用されます。

    using Org.BouncyCastle.Asn1; 
    using Org.BouncyCastle.X509; 
    using Org.BouncyCastle.Asn1.X509; 
    
    string GetMeTheOidThatIWant(byte[] certificate) 
    { 
        X509CertificateParser parser = new X509CertificateParser(); 
        X509Certificate cert1 = parser.ReadCertificate(certificate); 
    
        X509Extension certPolicies = 
         cert1.CertificateStructure.TbsCertificate.Extensions.GetExtension(X509Extensions.CertificatePolicies); 
    
        DerSequence seq = certPolicies.GetParsedValue() as DerSequence; 
    
        foreach (Asn1Encodable seqItem in seq) 
        { 
         DerSequence subSeq = seqItem as DerSequence; 
         if (subSeq == null) 
          continue; 
    
         foreach (Asn1Encodable subSeqItem in subSeq) 
         { 
          DerObjectIdentifier oid = subSeqItem as DerObjectIdentifier; 
          if (oid == null) 
           continue; 
    
          if (ThisIsTheOneIWant(oid)) 
           return oid.Id; 
         } 
        } 
    } 
    

    UPDATE:私は、証明書ポリシーOID(szOID_CERT_POLICIES)をサポート機能CryptFormatObjectに最近つまずきました。機能を試してみませんでしたが、便利です。そして5分後、私はそれがKinjal Dixitのanswerに記載されているものであることに気付きました。

    2

    ASN.1を解析するために必要なコードを減らすだけであれば、ASN.1 Editor projectのLCLib部分を見ることができます。

    これは単純なASN.1プロセッサライブラリです。 "[email protected]" のサンプルのDER符号化されたテスト文字列を使用して

    using (var stm = new MemoryStream(new byte[] { 0x16, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x31, 0x40, 0x72, 0x73, 0x61, 0x2e, 0x63, 0x6f, 0x6d })) 
    { 
        Asn1Parser parser = new Asn1Parser(); 
        parser.LoadData(stm); 
        var decoded = parser.ToString(); 
    } 
    

    16 0D 74 65 73 74 31 40 72 73 61 2E 63 6F 6Dは、フォーマットされた出力を与えます:

    オフセット| Len | LenByte |

    ====== ====== + + + ======= ====

    0| 13|  1| IA5 STRING : '[email protected]' 
    

    あなたは木を歩くと、通りのノードを処理することができますあなたは欲しい。

    +0

    解決策を探しているうちにこのページを見つけました。与えられたコードを操作した後、私は動作するコードを作った。しかし、与えられたコードは残りのプロジェクトと結合されています。これはエディタにデータを表示することを指向しています。それは動作しますが、理想的ではありません。ご回答いただきありがとうございますが、MonoはCodeProjectのページよりも優先されます。 – Dialecticus

    1

    ここでの問題は、証明書ポリシーフィールドが非標準形式を持っているということです。その内容はIETF RFCではなく、CA Browser Forumによって定義されています。 Extended Validation証明書を示すために使用されます。

    ここからそのフィールドの "www.bankofamerica.com"

    配列: ObjectIdentifier:2.5.29.32 certificatePolicies OctetStringに:(48、59、48、57、6、11、96、134、72、配列番号1、配列番号134、配列番号248、配列番号69、配列番号1、 116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111、 x06 \ x08 \ x06 \ x01 \ x05 \ x05 \ x05 \ x05 \ x05 \ x05 \ x03 \ x07 \ x02 \ x01 \ x16 \ x1chttps://www.verisign.com/rpa '

    これはダンプだったPythonライブラリ "pyasn1"を使用して小さなプログラムを作成し、DERおよびPEM形式のデータを解析できます。問題は、CertificatePoliciesの値がASN1型の "OctetString"であることです。つまり、ASN1の生のバイトです。他のほとんどのフィールドは、PrintableText、Integer、Dateなどの便利なタイプですが、このタイプはありません。

    1999年のRFC2527はこれに関する手のひら波です。その情報が記入されたはずの場所がありますが、そうではありませんでした。 OpenSSLの文書(http://www.openssl.org/docs/apps/x509v3_config.html)では、「未処理の拡張機能の構文は拡張コードによって管理されています。たとえば、複数のセクションにデータを含めることができます。使用は拡張コード自体によって定義されます:例の証明書ポリシー拡張をチェックしてください。 CABフォーラムEV証明書ガイドライン(http://www.cabforum.org/EV_Certificate_Guidelines.pdf)は、そのフィールドに入るものを定義します(付録Bを参照)。ただし、フォーマットについてはRFC3280を参照してください。 RFC3280によると、「証明書ポリシー拡張には、オブジェクト識別子(OID)とオプションの修飾子で構成される1つ以上のポリシー情報用語のシーケンスが含まれています」オプションの修飾子は存在していても構いません。ポリシー。したがって、OIDと「オプションの修飾子」を含む項目のASN1シーケンスであるはずです。しかし、EV証明書には実際に含まれているものではありません。

    EV証明書の許可されたOIDについては、公式の公式リストはありません。 CAブラウザフォーラムには、メンバーと共有するプライベートリストがあります。しかし、ウィキペディアで非公式のものを探してみてください。

    もっと後で私がフォーマットを理解するとき。

    +0

    詳細情報:2.5.29.32(certificatePolicies)のOIDに続く生のOctetStringは、DERエンコードされています。それをDERデコーダで実行すると、certポリシーを含む構造体が得られます。これはちょっとしたことです。 ASN1はツリーを表現するうまい方法を持っていますが、これはちょうど壊れています。 –

    4

    私はextension.Format()を使用して文字列表現を取得することができた:

    foreach (X509Extension extension in certificate.Extensions) 
    { 
        if(extension.Oid.FriendlyName.Equals("Certificate Policies")) 
        { 
         Console.WriteLine(extension.Format(true)); 
        } 
    } 
    

    私は見てしまった出力はこれを好き:

    [1]Certificate Policy: 
        Policy Identifier=2.16.356.100.2.3 
    

    これはcertmgr.mscツールを使用して証明書を表示するときに表示されます正確に何であります。これは、CCA Indiaによって定義された証明書のクラスを教えてくれます。たとえば、これはクラス3証明書です。

    関連する問題