问题描述
我正在写一个继承自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请求(根据当时的情况)的最后机会。实际谈判了。