【问题标题】:.NET CORE 5 '''HandshakeFailure'" when making HTTPS request.NET CORE 5 '''HandshakeFailure'" 发出 HTTPS 请求时
【发布时间】:2021-06-28 10:42:15
【问题描述】:

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

身份验证失败,因为远程方发送了 TLS 警报:'HandshakeFailure'。

有趣的是,它在 Postman 上运行良好(是的,我尝试从 postman 生成代码,但仍然无法正常工作)。

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

还是什么都没有。

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

Obs:我只能通过 VPN 访问这个端点,这会响吗?

Checking the TLS version used by the postman

【问题讨论】:

    标签: asp.net-core .net-core https ssl-certificate


    【解决方案1】:

    我也有类似的问题。就我而言,我的服务器的 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/浏览器中工作? 浏览器和其他工具附带自己的一组密码。这就是为什么这些工具不受此影响。

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

    【讨论】:

    • 你知道为什么 .net core 依赖于 9 年前操作系统提供的过时密码,而其他工具却提供了自己的密码。似乎可以将其添加为 nuget 包以防止这种情况。
    • 我不知道,为什么 .NET 在这些事情上依赖于操作系统。是的,我认为 NuGet 包可能是一个解决方案。此问题还有另一种可能的解决方案:如果您拥有所请求的域,则可以“降级”用于该域的密码。
    猜你喜欢
    • 2018-01-21
    • 2014-04-15
    • 2016-04-29
    • 2023-03-26
    • 2021-08-05
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多