随机抛出"无法建立SSL / TLS安全通道的信任关系"

时间:2015-07-10 13:52:35

标签: c# .net ssl https certificate

我知道有several threads about this,但我认为我的情况可能有所不同。

我们的应用程序需要向2个HTTPS URL发送请求:其中一个是ReCaptcha服务,另一个是来自巴西的政府服务(如果您来自巴西,可能您知道什么是SEFAZ和NF-e意思是:D)

有时,两者都停止工作。正如标题所说,例外是#34;无法为SSL / TLS安全通道建立信任关系"。当其中一个人开始抛出异常时,另一个人开始抛出异常,反之亦然:当其中一个起作用时,另一个也起作用。

一切都运行得很好,直到几天前这个异常开始随机抛出。此异常将在我们的生产服务器和内部开发服务器中抛出。

因此,有两个服务(ReCaptcha和这个政府服务)在两个服务器中显然同时停止工作,显然是随机的。他们停止工作,然后重新开始工作。

两种情况下的CA根都不同。一个使用GeoTrust Global CA,另一个使用ICP-Brasil。

Based on this thread,我们认为时钟可能错了,但显然不是。我们经常检查它。

我知道这个解决方案:

 ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

但它对我来说并不安全。使用这些解决方案有问题吗?

我们也可以使用它:

ServicePointManager.ServerCertificateValidationCallback = 
    ((sender, cert, chain, errors) =>  cert.Subject.Contains("ServerName"));

但我们真的好奇为什么这个异常显然是随机抛出的。如果我们不能在适当的情况下解决问题,我们可能会使用它。方式。

所以,我们没有想法了。我们的服务在Windows Server 2008R2和IIS 7.5上运行。我还应该寻找什么?

1 个答案:

答案 0 :(得分:3)

  

<img>

     

但它对我来说并不安全。使用这些解决方案有问题吗?

嗯,是的!有了这个,您就可以让每个服务器上的任何证书成为您认为与之交谈的服务器。< / p>

同样如此:

ServicePointManager.ServerCertificateValidationCallback =
      ((sender, certificate, chain, sslPolicyErrors) => true);

仅验证ServicePointManager.ServerCertificateValidationCallback = ((sender, cert, chain, errors) => cert.Subject.Contains("ServerName")); 在这里已经足够了。您至少应该在此处应用更多条件,例如GetSerialNumberString()GetPublicKeyString()GetCertHashString()来验证证书的正确性。 但恕我直言: 不要在现场环境中这样做 - 永远不要! - 仅用于开发和测试目的。

关于主要错误 - this answer you already linked的一部分可能是问题的原因: 当两个证书同时停止工作时,它最有可能成为证书链的问题。证书使用的链中的一部分可能不可用,因此信任链被破坏,并且无法建立安全通道。

据我所知,您应该能够覆盖Subject,记录证书链and still return the basic validation afterwards。这会让你更接近错误来源。