【发布时间】:2010-11-11 16:00:28
【问题描述】:
我在单个方法中使用以下代码行来显式检查和信任来自以下主机的 SSL 证书:MyTrustedCompany.com:
ServicePointManager.ServerCertificateValidationCallback = Function(obj As [Object], certificate As X509Certificate, chain As X509Chain, errors As SslPolicyErrors) (certificate.Subject.Contains("CN=MyTrustedCompany.com"))
代码没有问题 -> 100% 完美运行。
问题是,它的影响太大了。我认为它的范围只会在我贴花它的方法内,但显然它是“ServicePointManager”对象上的一个共享属性,并且必须在整个应用程序中持续存在,这是我不想要的。
问题是稍后我调用我的 Web 服务等并得到“无法建立信任关系......”异常。这是因为在上面的代码行中,我检查了特定于该方法的 SSL 证书的主机名。我快速测试了从回调中返回“真”,因此所有证书都是可信的,而不是检查特定名称(即 MyTrustedCompany)和后续请求工作。这就是我知道这个回调分配比那个单一方法到达父亲的方式。当然,我可以扩展回调以包含所有其他证书名称,但我宁愿做的是将“ServerCertificateValidationCallback”设置回其默认行为。就像下面的伪代码:
ServicePointManager.ServerCertificateValidationCallback = Nothing 'Default checking behavior
如何删除自定义验证并将其设置回默认行为?谢谢!
【问题讨论】:
-
您可以将其设置为等于执行默认行为的函数:当不使用自定义验证时,将证书名称与用于创建请求的主机名进行比较。例如,如果向 Create(String) 传递参数“contoso.com/default.hmtl”,则默认行为是客户端根据 www.contoso.com 检查证书。 msdn.microsoft.com/en-us/library/…
-
一个类似的问题有一个看起来不错的答案stackoverflow.com/a/44803221/57428
标签: .net vb.net ssl ssl-certificate