对 ServicePointManager ServerCertificateValidationCallback 的混淆

Confusion over ServicePointManager ServerCertificateValidationCallback

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

ServiceCertificateValidationCallback 正在开火 (errors == SslPolicyErrors.None) returns 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
        }
        

Which object or process invokes that callback?

在 .NET Framework 中大致如下:

  • WebClient 创建一个 HttpWebRequest
  • HttpWebRequest 呼叫 ServicePointManager.FindServicePoint(uri)
  • 生成的 ServicePoint 实例创建连接并将 ServerCertificateValidationCallback 注册为任何封闭 TLS 隧道上的 post-handshake 挂钩。

这是一个严重的过度简化,但这些是涉及的关键 public 成员。

do I understand correctly that chain.Build() would be an unnecessary redundant step?

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

OS/platform 已经完成握手并给出了判决, ServerCertificateValidationCallback 只是您作为用户放弃连接或继续网络请求的最后机会,以实际协商为准。