我知道有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上运行。我还应该寻找什么?
答案 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。这会让你更接近错误来源。