为什么我的ServicePointManager.ServerCertificateValidationCallback被忽略?

时间:2014-01-24 22:45:43

标签: c# .net winforms certificate

我正在winforms应用中发出网络请求。我正在提供自定义证书验证:

    ServicePointManager.ServerCertificateValidationCallback += 
        new RemoteCertificateValidationCallback(certValidator.ValidateRemoteCertificate);

其中certValidator.ValidateRemoteCertificate是

public bool ValidateRemoteCertificate(object sender, X509Certificate certificate,
                                      X509Chain chain, SslPolicyErrors policyErrors)
{
        return false;
}

如您所见,此回调应拒绝所有服务器证书并关闭所有尝试的连接。

我的问题是这个回调完全被忽略了。我提交了一个https请求,它就像一个魅力。在调试器中观察它我可以看到永远不会调用ValidateRemoteCertificate

为什么我的替换回叫从未回拨过?

编辑:LB要求提供网络请求,所以这里是:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sourceUrl);
request.UseDefaultCredentials = true;
request.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))";    

request.KeepAlive = false;
request.Headers.Add("Accept-Language", "en-us,en;q=1.0");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

编辑2:它可能不相关,但在.config文件中,我指示它使用配置代理,如下所示:

<system.net>
    <defaultProxy useDefaultCredentials="true"/>
</system.net>

编辑3:下面是一个完整的,最小的例子,表明了这种行为。我希望这个例子能够抛出异常,因为所有的证书都应该被拒绝,但它可以正常工作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;

namespace SPMCertCallbackDemonstrator
{
    class Program
    {
        static void Main(string[] args)
        {
            ServicePointManager.ServerCertificateValidationCallback = delegate { return false;};
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
            request.Method = "GET";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        }
    }
}

为什么我的替换回叫从未回拨过?

1 个答案:

答案 0 :(得分:5)

我发布的原始代码没有任何问题。我正在请求http而不是https。因此,不需要证书验证。一旦我调用了https请求,它就可以正常工作。