私は、アプリケーション内のいくつかの自己署名証明書を信頼する必要があるので、私はこのような検証コールバックをオーバーライドします。C#でServicePointManager.ServerCertificateValidationCallbackをオーバーライドするときにデフォルトの証明書チェックを呼び出す方法は?
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
...
public static bool MyRemoteCertificateValidationCallback(
Object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
if (IsAprrovedByMyApplication(sender, certificate)) // <-- no matter what the check here is
return true;
else
return false; // <-- here I'd like to call the default Windwos handler rather than returning 'false'
}
しかし、ときそこにいくつかの政策の誤りをしている、と私が接続していますサイトはによって承認されていませんアプリケーションでは、例外がスローされます。 ここでの問題点は、Windowsの標準動作とは異なる点です。
は、このサイトを考えてみましょう:https://www.dscoduc.com/
ことの証明書が不明な発行者を持っているので、信頼できません。私はそれをMMCと共にLocal CopmuterのTrusted People(Windows 7)に追加しました。
私は、証明書の検証コールバックを上書きせずにこのコードを実行する場合:
HttpWebRequest http = (HttpWebRequest)HttpWebRequest.Create("https://www.dscoduc.com/");
using (WebResponse resp = http.GetResponse())
{
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
string htmlpage = sr.ReadToEnd();
}
}
それは正常に接続します。 これは、Windowsのデフォルトのバリデーターがこの証明書を信頼することを決定したことを意味します。
しかし、私はServerCertificateValidationCallbackを上書きしたら、私のコールバックがSslPolicyErrors.RemoteCertificateChainErrors とチェーンと呼ばれているが、ステータスを持つ1つの要素が含まれますX509ChainStatusFlags.PartialChain(私は現在のbecuase、ここにはエラーを受信しないことを期待するという事実に
このサイトは信頼できるリストには含まれていないため、コールバックから「true」を返すことは望ましくありません。 しかし、私は「偽」も返さないことを願っていません。または、「リモート証明書が検証手順に従って無効です」という例外が表示されます。https://www.dscoduc.com/には明らかに期待されていません。証明書コールバックがオーバーライドされていない場合、Windowsによって承認されます。 このサイトでは、Windowsでデフォルトの検証手順を実行します。 Windowsで既に実装されている(うまくいけばうまくいけば)ので、私はWindows Trustedストアを自分自身で調べ、すべてのチェーン要素を調べることは望ましくありません。
つまり、ユーザーが承認したサイト(自分の設定のどこかに保存されているサイト)を明示的に信頼し、他のすべてのユーザーに対してデフォルトの認証チェックを呼び出す必要があります。
ServicePointManager.ServerCertificateValidationCallbackのデフォルト値はnullです。したがって、後で呼び出すための 'デフォルト'コールバックはありません。 この「デフォルト」の証明書ハンドラをどのように呼び出す必要がありますか?
おかげ