現在、HTTPSを使用して相互認証されたクライアント/サーバーアプリケーション間の通信を洗練しています。私は現在、C#クライアントに検証ロジックを構築して、TLS接続が失敗した場合の構成上の問題を識別しています。接続を検証する際に、サーバーが提示するルートCA証明書がクライアント、適切なストアにインストールされ、有効であることを検証します。 X509Store
を使用してX509Certificate2
を取得し、X509Chain
を使用して検証しています。C#を使用して、Windows証明書ストアの証明書が無効になっているかどうかをプログラムで判断する方法
私の問題は、証明書がMMC経由で無効になっていても有効であると報告することです。チェーンレポートが有効であるにもかかわらず、TLS接続は失敗します。
それは私が何かを報告することによって対処したいと思いますそうケースだが、一つの「ルートCAが無効になっているため接続できませんでした。」
証明書の「証明書の目的」の値を決定するために作成できる.NETまたはWin32呼び出しの方向に誰かを指摘できますか?または、証明書の「証明書ステータス」を読む?
私は、System.Security.Cryptography名前空間に何のMSDNの上場を読んで、とのCryptoAPIとCNGに探し始めたが、今のところ何も見つかりませんでした。
ありがとうございます!
優秀!詳細な説明をありがとうございます。 SSL証明書自体ではなく、ルートCAを確認しているので、EKU拡張機能はありません(まさにあなたが言ったように)。しかし、 "Key Usage"(2.5.29.15)のoidを 'ApplicationPolicy'に追加することは、魅力的です。 –
私はそれが実現不可能な解決策であると言います。実際には、すべてのブラウザが特定の用途にフルチェーンを有効にする必要はなく、リーフ証明書が必要な用途にのみ使用されている場合にのみチェックします。プロパティを介してルートCA証明書の使用を取得する場合は、チェックします。中間CAレベルでの使用が禁止されている場合があるためです。その結果、ルートCAは正常ですが、コードは失敗し、接続は正常に動作します。 – Crypt32
@ crypt32 EKUは適切なサブセットでなければなりません。中間体がEKUをブロックする場合、リーフはそれを持つことができません。彼がチェックするために使用しているキー使用は無関係です。EKUからのOIDを要求しているため、EKUがない場合は許可されます。 – bartonjs