随机抛出“无法为SSL/TLS安全通道建立信任关系”
本文关键字:通道 安全 TLS 建立 信任 关系 SSL 无法为 随机 | 更新日期: 2023-09-27 18:01:59
我知道关于这个问题有很多讨论,但我想我的情况可能会有所不同。
我们的应用程序需要向2个HTTPS URL发送请求:其中一个是ReCaptcha服务,另一个是来自巴西的一些政府服务(如果你来自巴西,可能你知道SEFAZ和NF-e的意思:D)
有时候,两者都停止工作。正如标题所说,例外情况是"无法为SSL/TLS安全通道建立信任关系"。当其中一个开始抛出异常时,另一个也开始抛出异常,反之亦然:当其中一个工作时,另一个也工作。
一切都运行得很好,直到几天前,这个异常开始随机抛出。这个异常会在我们的生产服务器和内部开发服务器中抛出。
所以,有两个服务(ReCaptcha和这个政府服务)显然在两个服务器上同时停止工作,显然是随机的。他们停止工作,然后又开始工作。
两种情况下CA根不同。一个使用GeoTrust Global CA,另一个使用ICP-Brasil。
基于这个线程,我们认为也许时钟是错误的,但显然不是。我们经常检查。
我知道这个解决方案:
ServicePointManager.ServerCertificateValidationCallback =
((sender, certificate, chain, sslPolicyErrors) => true);
但是它看起来对我来说不太安全。使用这些解决方案有问题吗?
我们也可以这样写:
ServicePointManager.ServerCertificateValidationCallback =
((sender, cert, chain, errors) => cert.Subject.Contains("ServerName"));
但是我们真的很好奇为什么这个异常是随机抛出的。如果我们不以"适当"的方式解决它,我们可能会使用它。
所以,我们没主意了。我们的服务运行在Windows Server 2008R2和IIS 7.5上。我还应该寻找什么?
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
但是它看起来对我来说不太安全。使用这些解决方案有问题吗?
嗯,是的!这样,您就允许每个具有任何证书的服务器成为您认为正在与之交谈的服务器。
ServicePointManager.ServerCertificateValidationCallback =
((sender, cert, chain, errors) => cert.Subject.Contains("ServerName"));
仅验证Subject
在这里是不够的。您至少应该在这里应用更多的标准,例如GetSerialNumberString()
, GetPublicKeyString()
和GetCertHashString()
来验证证书的正确性。但是恕我直言:不要在真实环境中这样做——永远不要! -仅用于开发和测试。
关于主要错误-你已经链接的这个答案的一部分可能是问题的原因:当两个证书同时停止工作时,很可能是证书链出了问题。链中两个证书都使用的部分可能不可用,因此信任链被破坏,安全通道无法建立。
据我所知,您应该能够覆盖ServerCertificateValidationCallback
,记录证书链,并且之后仍然返回基本验证。