.NET CORE 5 '''HandshakeFailure'" 发出 HTTPS 请求时

.NET CORE 5 '''HandshakeFailure'" when making HTTPS request

这个请求在 c#(RestClient 或 HttpClient)上根本不起作用。 当我尝试连接到 RestSharp 上的端点时,我得到 StatusCode 0,而在 HttpClient 上,我得到这个异常:

Authentication failed because the remote party sent a TLS alert: 'HandshakeFailure'.

有趣的是,它在 Postman 上工作得很好(是的,我尝试从 Postman 生成代码,但它仍然没有工作)。

我看了邮递员,它使用了 TLS 1.2 证书,然后我尝试了这个:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

仍然,没有。

检查了 url、身份验证、headers、http 动词,一切正常。

Obs:我只能通过 VPN 访问此端点,是否响铃?

Checking the TLS version used by the postman

我也有类似的问题。就我而言,我服务器的 windows 版本太旧了。这些请求在我的(最新的)Windows 10 笔记本电脑上完全正常,但在我的 Windows Server 2012 R2 机器上会因“HandshakeFailure”而失败。

如果我理解正确的话,这一切都归结为您的操作系统附带的受支持的密码。 (您可以在此处找到大多数 windows 版本支持的所有密码列表:https://docs.microsoft.com/en-au/windows/win32/secauthn/cipher-suites-in-schannel)。

如果您的 HTTPS 网站使用您的操作系统不支持的密码,.NET 将抛出此错误。您可以使用 sslscan (https://github.com/rbsec/sslscan).

等工具找出 HTTPS 端点支持的密码

为什么它在 Postman/Browsers 中有效? 浏览器和其他工具附带了自己的一套密码。这就是为什么这些工具不受此影响的原因。

遗憾的是,除了更新您的 windows 机器外,我不知道有任何解决方法。但我希望它能回答为什么它不起作用的问题。

这个问题还有另一种可能的解决方案,但前提是您拥有所请求的域。您可以“降级”域使用的密码。

我知道有点晚了,但对于那些有同样问题的人,我建议使用 Nartac 提供的 IISCrypto 工具here

引用他们的网站:

IIS Crypto is a free tool that gives administrators the ability to enable or disable protocols, ciphers, hashes and key exchange algorithms on Windows Server 2008, 2012, 2016 and 2019. It also lets you reorder SSL/TLS cipher suites offered by IIS, change advanced settings, implement Best Practices with a single click, create custom templates and test your website.

在大多数情况下,按“最佳实践”按钮并重新启动就足够了。