恢复SSL证书覆盖检查

我正在编写测试来测试我正在部署的服务,绕过ssl证书检查我使用下面的代码片段实现了ssl覆盖:

public static void SSLValidationOverride() { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnValidationCallback); } private static bool OnValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) { if (cert.subject == MyCertSubject) return true; else return false; } 

现在我必须在代码中使用ssl调用另一个web服务,并希望在调用之前切换到默认的ssl检查。 什么是最好的方法。 MS帮助说ServicePointManager.SecurityProtocol的默认值为null( http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol.aspx )。 将它设置为null会切换到默认的sslvalidation,还有其他方法可以做到这一点。

在开发我创建的诊断工具期间,我遇到了类似的问题。 我创建了一个Windows服务,它向URL列表发出请求。 对于每个url,我通过设置以下方式提出没有证书validation的请求:

 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

然后使用相同的url我还尝试通过将属性重置为null来提出证书validation请求,该属性应该提供默认function:

 ServicePointManager.ServerCertificateValidationCallback = null; 

这有意想不到的结果,因为我的请求仍然在没有证书validation的情况下进行,就像忽略了重置一样。 调试后我发现如果我在设置后等待足够长的时间

 ServicePointManager.ServerCertificateValidationCallback = null; 

然后它实际上被重置,我的请求是使用默认证书validation。 所以我在做出请求之前只是睡了30秒:

 ServicePointManager.ServerCertificateValidationCallback = null; System.Threading.Thread.Sleep(30000); //Make request here 

我不明白为什么会这样,但确实有更好的方法,如果你知道怎么做,请告诉我。

我最终将ServicePointManager.SecurityProtocol设置为null,它工作正常。 虽然我仍然愿意接受更好的方法

 public static void SSLValidationRestore() { ServicePointManager.ServerCertificateValidationCallback = null; } 

将回调设置为null不起作用。 相反,所有证书都通过。 我不明白为什么这么多人发布了将值设置为null作品或 – =作品。 这项工作也没有……至少在3.5。 经过进一步测试后,似乎只是缓存了支票。 一旦validation证书,重新检查一次不会导致回调被调用。

我遇到了类似的问题。 您可以将ServicePointManager.MaxServicePointIdleTime更改为较低的值,而不是在@Acode Monkey解决方案上调用Thread.Sleep()。

 ServicePointManager.MaxServicePointIdleTime = 1;