我正在编写一个继承自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框架中,大致如下:
WebClient
创建一个HttpWebRequest
HttpWebRequest
调用ServicePointManager.FindServicePoint(uri)
- 生成的
ServicePoint
实例创建连接,并将ServerCertificateValidationCallback
注册为任何封闭TLS隧道上的握手后挂钩
这是一个过于简单化的说法,但这些都是关键的公众成员。
我是否正确理解
chain.Build()
将是一个不必要的冗余步骤?
除非您有特定需要作为自定义验证例程的一部分来检查证书链,否则这是多余的。
操作系统/平台已经完成了握手,并给出了结论,ServerCertificateValidationCallback
只是作为用户放弃连接或根据实际协商内容继续进行web请求的最后机会。