随机投掷"Could not establish trust relationship for the SSL/TLS secure channel"

Randomly throwing "Could not establish trust relationship for the SSL/TLS secure channel"

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

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

有时,两者都会停止工作。正如标题所说,例外是 "Could not establish trust relationship for the SSL/TLS secure channel"。当其中一个开始抛出异常时,另一个也开始抛出异常,反之亦然:当其中一个有效时,另一个也有效。

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

所以,有 2 个服务(ReCaptcha 和这个政府服务)在两个服务器中明显同时停止工作,显然 运行domly。他们停止工作然后又开始工作。

两种情况下的 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"));

但我们真的很好奇为什么这个异常明显地 运行domly 抛出。如果我们不以 "proper" 方式解决它,我们可能会使用它。

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

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

But it doesn't look very safe for me. Is there a problem using those solutions?

嗯,是的! 有了这个,您允许 每个 具有任何证书的服务器成为您认为自己的服务器

同样适用于此:

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

这里仅验证 Subject 是不够的。您至少应该在这里应用更多标准,例如GetSerialNumberString(), GetPublicKeyString() and GetCertHashString()验证证书的正确性。 但是恕我直言: 不要在实时环境中这样做 - 永远不要! - 仅用于开发和测试目的。

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

据我所知,您应该能够覆盖 ServerCertificateValidationCallback,记录证书链,。这将使您更接近错误源。