2010-08-10 54 views
2

我写一个测试,测试服务,我部署,绕过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; 
} 

现在我必须调用另一个webservice在代码中使用ssl,并且希望在调用之前切换到默认的ssl检查。什么是最好的方式来做到这一点。 MS帮助表示ServicePointManager.SecurityProtocol的默认值为空(http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol.aspx)。将它设置为null将切换到默认的ssl验证,并有任何其他方式来做到这一点。

回答

2

我结束了将ServicePointManager.SecurityProtocol设置为空,它工作正常。虽然我仍然开放更好的方式来做到这一点


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

适合我。使用各种情况进行测试(好的和不好的https网址)。 – 2015-05-28 19:32:40

2

将回调设置为null不起作用。相反所有的证书都通过了。我不明白为什么有那么多人发布设置值为空作品或 - =作品。至少在3.5时间里,工作都没有...。经过进一步测试,似乎该检查只是缓存。一旦证书被验证一次,重新检查不会导致回调被调用。

+0

我不同意这一点。我只是使用好的和不好的HTTPS url来测试每种方式。通过将其设置回null,它看起来像回到默认行为。 – 2015-05-28 19:31:13

6

我在创建诊断工具的过程中遇到了类似的问题。我创建了一个窗口服务,向请求列表中的url列表发送请求。每个网址我让没有证书验证的请求通过设置这样的:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

,然后用相同的URL我也试图通过重置属性为null,这样应该提供的默认功能为与证书验证的请求:

ServicePointManager.ServerCertificateValidationCallback = null; 

这带来了意想不到的结果,就好像复位就已经忽视了我的请求仍然没有证书验证做。调试后,我发现,如果我设置

ServicePointManager.ServerCertificateValidationCallback = null; 

后等待足够长时间,然后它实际上是重置和我的请求被默认证书验证做。所以我只是把一个睡在30秒之前,我所提出的要求:

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

我不明白为什么这个工作,但它确实和我敢肯定有这样做的更好的方法,如果你知道如何,请让我知道。

+0

采用相同的解决方案。我之前使用委托来禁用它,然后使用try/catch/finally在finally中将其设置为null。 – 2015-05-28 19:31:50

0

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

ServicePointManager.MaxServicePointIdleTime = 1;