8

証明書のチェーンを検証したいのですが、X509Certificate2コレクションを取得し、すべての証明書が 1 つのチェーンを構築するかどうかを検証する必要があります。

通常、証明書チェーンを検証するには、リーフ証明書からデジタル署名を取得し、ルート証明書によって署名されているかどうかを確認する必要がありますX509Certificate2、.NET ではオブジェクト から署名を抽出する方法が見つかりません。

したがって、X509Chain.Build()次の方法でメソッドを使用することを考えました。

   void ValidateChain(X509Certificate2Collection collection, X509Certificate2 leaf)
    {
        X509Chain x509Chain = new X509Chain();
        x509Chain.ChainPolicy.ExtraStore.AddRange(collection);
        bool isValid = x509Chain.Build(leaf); 
    }

しかし、ビルド方法についていくつか質問があります。

  1. 私が理解したように、チェーンは私のコンピューターストアからも構築されました. からのみ構築したいのですが、ExtraStoreこの動作をどのように定義できますか?
  2. チェーンが構築された後、ルート証明書が含まれていないことがわかりました。私の質問は、チェーン要素の一部ではないため、チェーンにルート CA があることを確認するにはどうすればよいかということです。

メソッドがどのように機能するかを誰かが説明してくれれば、とても感謝していますBuild()

4

2 に答える 2

4

ビルド操作の後、ChainStatus 値を使用する必要があります。MSDNリファレンスはこちら

X509Chain オブジェクトには、証明書の検証に使用する必要がある ChainStatus と呼ばれるグローバル エラー ステータスがあります。証明書の検証を管理するルールは複雑であり、関係する 1 つ以上の要素のエラー ステータスを無視することで、検証ロジックを単純化しすぎてしまいがちです。グローバル エラー ステータスでは、チェーン内の各要素のステータスが考慮されます。

于 2014-07-30T17:54:35.903 に答える
0

次のコード スニペットを試してください。

bool chainIsValid = false;

var chain = new X509Chain();
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

chainIsValid = chain.Build(certificate);
于 2011-11-15T21:39:28.500 に答える