5

ssl 証明書のエラーを無視するためにServicePointManager.ServerCertificateValidationCallbackHttpWebRequest. これを内部リクエストに対してのみ実行したいので、プロパティをfinallyブロックのデフォルト値にリセットしています。しかし、これは Web アプリケーションであるため、複数のスレッドがプロパティを変更しているときに問題は発生しますか?

これが私がプロパティを使用している方法です

public static String GetResource()
{
    try
    {        
        ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };        
    }
    catch()
    {
    }
    finally
    {
        ServicePointManager.ServerCertificateValidationCallback -= delegate { return false; };
    }    
}
  1. このコードはスレッドセーフになりますか? msdn のドキュメントには、タイプ ServicePointManager の静的メンバーはすべてスレッドセーフであると書かれていますが、確認したかっただけです。 http://msdn.microsoft.com/en-us/library/zkfa48de%28v=vs.80%29.aspx
  2. finally ブロックのコードは、デフォルト値にリセットする正しい方法ですか?
4

1 に答える 1

5

デフォルトの証明書検証をオーバーライドする必要がある場合は、次の 1 つ以上を検討してください。

  1. ServerCertificateValidationCallbackアプリケーションの起動時、または静的コンストラクターで、1 回だけ設定します。これにより、スレッド競合のリスクがなくなります。
  2. セキュリティをより寛容にしているので、動作を条件付きコンパイルでビルドをデバッグするように制限します。

    #if DEBUG
        ServicePointManager.ServerCertificateValidationCallback += Callback;
    #endif
    
  3. 最後に、デリゲートは豊富な関数であることを思い出してください。単に返す必要はありませんtrue。リクエストを調べて、その処理方法を決定できます。

    ServicePointManager.ServerCertificateValidationCallback += Callback;
    
    static bool Callback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (IsInternalRequest(sender))
        {
            return true;
        }
        else
        {
            return IsExternalRequestValid(sender, certificate, chain, sslPolicyErrors);
        }
    }
    
于 2015-10-08T02:52:23.390 に答える