我在虚拟机中有一个 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; };
Run Code Online (Sandbox Code Playgroud)
但我不想更改我的代码并再次部署它。有什么方法可以在托管 Windows 服务的虚拟机中执行某些操作(例如信任证书或其他操作),从而解决此问题?
在这方面的任何帮助都非常有帮助。谢谢。
我知道这个问题被多次询问,但所有解决方案都要求我更改托管 api 的服务器或更改我的代码以添加上面的行。我正在寻找一种可以在客户端计算机而不是其他地方进行更改的解决方案。
我遇到过几次这样的情况。这可能意味着几件事:
对于前两个选项,您可以使用 nmap 来确定服务器支持的协议和密码列表:
nmap -sV --script ssl-enum-ciphers -p 443 <host>
Run Code Online (Sandbox Code Playgroud)
获得支持的协议/密码列表后,您可以使用名为IISCrypto的免费工具在客户端计算机上检查自己的协议/密码,并验证您是否已启用匹配的协议/密码组合。
对于最后一个选项,如果您运行的版本低于 .NET Framework 4.6.1,则可能需要添加:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Run Code Online (Sandbox Code Playgroud)
我真的不建议严格按照上面的方式设置协议(因为 TLS 1.3 即将到来)。应始终尝试让 Windows 为您确定最高的安全性。有时某些罪恶是前进所必需的。您以后随时可以重新访问它。
这帮助我解决了这个特殊问题。希望它能对您有所帮助。
| 归档时间: |
|
| 查看次数: |
6735 次 |
| 最近记录: |