对ServicePointManager ServerCertificateValidationCallback的困惑

问题描述

我正在写一个继承自System.Net.WebClient的类。

ServiceCertificateValidationCallback正在触发,(errors == SslPolicyErrors.None)返回true

System.Net.ServicePointManager.ServerCertificateValidationCallback =
               delegate (Object obj,X509Certificate certificate,X509Chain chain,System.Net.Security.SslPolicyErrors errors)
               {
                  isTrusted = (errors == SslPolicyErrors.None);
               };

哪个对象或进程调用该回调?并且由于正在调用 ,我是否正确理解chain.Build()是不必要的冗余步骤?

        X509Certificate2 rootCert = (X509Certificate2)certificate;
        X509Certificate2 clientCert =store.Certificates.Find(X509FindType.FindByThumbprint,rootCert.thumbprint,false)[0]

        chain.ChainPolicy.ExtraStore.Add((X509Certificate2) certificate);
        if (chain.Build(clientCert))
        {
            // trusted chain
        }
        

解决方法

哪个对象或进程调用该回调?

在.NET Framework中,它大致适用于:

  • WebClient创建一个HttpWebRequest
  • HttpWebRequest呼叫ServicePointManager.FindServicePoint(uri)
  • 作为结果的ServicePoint实例创建连接并将ServerCertificateValidationCallback注册为任何封闭的TLS隧道上的握手后挂钩。

这是一个过分的简化,但是这些是涉及的关键公共成员。

我是否正确理解chain.Build()是不必要的重复步骤?

除非您有特定的需求作为自定义验证例程的一部分检查证书链,否则,这将是多余的。

OS /平台已经完成了握手,并给出了结论,ServerCertificateValidationCallback只是您作为用户放弃连接或继续进行Web请求(根据当时的情况)的最后机会。实际谈判了。