2017-06-02 6 views
0

現在、HTTPSを使用して相互認証されたクライアント/サーバーアプリケーション間の通信を洗練しています。私は現在、C#クライアントに検証ロジックを構築して、TLS接続が失敗した場合の構成上の問題を識別しています。接続を検証する際に、サーバーが提示するルートCA証明書がクライアント、適切なストアにインストールされ、有効であることを検証します。 X509Storeを使用してX509Certificate2を取得し、X509Chainを使用して検証しています。C#を使用して、Windows証明書ストアの証明書が無効になっているかどうかをプログラムで判断する方法

私の問題は、証明書がMMC経由で無効になっていても有効であると報告することです。チェーンレポートが有効であるにもかかわらず、TLS接続は失敗します。

Certificate Properties

それは私が何かを報告することによって対処したいと思いますそうケースだが、一つの「ルートCAが無効になっているため接続できませんでした。」

証明書の「証明書の目的」の値を決定するために作成できる.NETまたはWin32呼び出しの方向に誰かを指摘できますか?または、証明書の「証明書ステータス」を読む?

Certificate Status

私は、System.Security.Cryptography名前空間に何のMSDNの上場を読んで、とのCryptoAPIとCNGに探し始めたが、今のところ何も見つかりませんでした。

ありがとうございます!

答えて

0

このダイアログは、証明書を「無効にする」ことではなく、「すべての目的で」無効にします。これは、EKUの検証のために空の拡張キー使用拡張があるとみなすことを意味します。

通常、ルート証明書(または中間CA証明書)にはEKU拡張がないため、任意のApplicationPolicy値でチェーンビルドを行うと一致します。すべての目的でDisableに設定すると、チェーンエラーX509ChainStatusFlags.NotValidForUsageが発生します。あなたがTLSを検証するために何かを構築したい場合は

あなたは(あなたがチェックしているものに応じて)サーバー認証やクライアント認証のEKUのいずれかを確認したい:

// Server EKU or Client EKU 
Oid eku = forServer ? new Oid("1.3.6.1.5.5.7.3.1") : new Oid("1.3.6.1.5.5.7.3.2"); 

// Test if it's valid for that purpose 
chain.ChainPolicy.ApplicationPolicy.Add(eku); 

は、あなたが「オフ」したい場合ルートCAを完全に削除するには、証明書のコピーをDisallowedストア(UIの「信頼できない証明書」と呼ばれます)に追加します。その結果、チェーンの構築が行われ、X509ChainStatusFlags.ExplicitDistrustが生成されます。

+0

優秀!詳細な説明をありがとうございます。 SSL証明書自体ではなく、ルートCAを確認しているので、EKU拡張機能はありません(まさにあなたが言ったように)。しかし、 "Key Usage"(2.5.29.15)のoidを 'ApplicationPolicy'に追加することは、魅力的です。 –

+0

私はそれが実現不可能な解決策であると言います。実際には、すべてのブラウザが特定の用途にフルチェーンを有効にする必要はなく、リーフ証明書が必要な用途にのみ使用されている場合にのみチェックします。プロパティを介してルートCA証明書の使用を取得する場合は、チェックします。中間CAレベルでの使用が禁止されている場合があるためです。その結果、ルートCAは正常ですが、コードは失敗し、接続は正常に動作します。 – Crypt32

+0

@ crypt32 EKUは適切なサブセットでなければなりません。中間体がEKUをブロックする場合、リーフはそれを持つことができません。彼がチェックするために使用しているキー使用は無関係です。EKUからのOIDを要求しているため、EKUがない場合は許可されます。 – bartonjs

関連する問題