System.Net.WebException: 底层连接已关闭:无法建立 SSL/TLS 安全通道的信任关系

6
我在一个虚拟机上有一个 Windows 服务。它正在调用另一台服务器上托管的 API。当我从我的 Windows 服务调用该 API 时,它会给我一个错误提示:

System.Net.WebException:基础连接已关闭:无法建立 SSL/TLS 安全信道的信任关系。---> System.Security.Authentication.AuthenticationException:根据验证过程,远程证书无效。

现在我知道如果在调用 api 前添加此行代码,它就会正常工作。

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

但我不想更改我的代码并再次部署它。有没有办法可以在托管Windows服务的VM中做些什么,比如信任证书或其他操作,这样就能解决这个问题了?任何关于此方面的帮助都非常有用。谢谢。我知道这个问题被问了很多次,但所有的解决方案都要求我要么在托管API的服务器上进行更改,要么更改我的代码以添加上述行。我正在寻找一种解决方案,可以在客户机器上更改而不是在其他地方进行更改。

好的,那么它无效的原因是什么?如果是信任链的问题,那么你可以在节点上信任CA/链,但如果CA没有得到很好的保护,那可能会带来其他风险;如果是日期、错误的主机等问题,那么可能不是这个原因。 - Marc Gravell
@MarcGravell 非常感谢您的快速回复。我没有看到其他风险,因为这些所有机器都在公司网络中得到了很好的保护。您能告诉我如何信任节点上的证书吗? - CrazyCoder
你是否有CA证书的PFX格式文件?只需要公共部分即可。 - Marc Gravell
1个回答

2

我遇到过几次这种情况。可能意味着以下几点:

  • 不支持的协议(SSL/TSL)
  • 没有匹配的密码
  • .NET Framework版本<4.6.1需要特殊代码

对于前两个选项,您可以使用nmap来确定服务器支持的协议和密码列表:

nmap -sV --script ssl-enum-ciphers -p 443 <host>

一旦获得支持的协议/密码列表,您可以使用免费工具IISCrypto在客户端机器上检查自己,并验证您是否启用了匹配的协议/密码组合。
对于最后一种选项,如果您运行的是低于.NET Framework 4.6.1的任何版本,则可能需要添加:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

我并不建议严格按照上述协议设置(因为TLS 1.3即将推出)。应该尝试让Windows为您确定最高的安全性。有时候,某些恶劣行为是前进的必要条件。您随时可以稍后重新审视它。

这帮助我解决了这个特定的问题。希望它也能帮助您解决您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接