随机投掷"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
,记录证书链,。这将使您更接近错误源。
我知道有 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
,记录证书链,