当服务器使用TLS 1.1进行响应时,.net 4.7无法创建SSL通道



我正在尝试使用客户端证书身份验证进行HTTPS GET请求,但失败

The request was aborted: Could not create SSL/TLS secure channel.

我正在使用Java尝试同样的请求,它运行得很好,我在Java日志中看到了以下内容(仅限于有趣的部分):

*** ClientHello, TLSv1.2
main, WRITE: TLSv1.2 Handshake, length = 185
....
*** ServerHello, TLSv1.1
main, READ: TLSv1.1 Handshake, length = 3339

据我所知,这意味着,由于某种原因,服务器不支持TLS 1.2,但客户端接受了这一点,并简单地回退到TLS 1.1。

当我设置时

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;

.NET也很好用。现在的问题是,为什么.NET没有像Java那样回退到TLS 1.1,我能以某种方式启用回退吗(而不需要实际尝试TLS 1.2,捕获异常并尝试使用TLS 1.1)?

ServicePointManager.SecurityProtocol的描述中称为

请注意,此属性没有特意列出默认值。安全环境不断变化,默认协议和保护级别随时间变化,以避免已知弱点。默认值会因机器而异配置,以及安装软件的位置已应用修补程序。

您的代码永远不应该隐式地依赖于使用特定的保护级别,或者假设默认情况下使用安全级别。如果您的应用程序依赖于特定的安全级别,必须明确指定该级别,并且然后检查以确保它在已建立的联系此外,您的代码应该设计为在面对支持哪些协议的更改,因为这些更改是通常在几乎没有提前通知的情况下进行,以减少出现威胁。

在.NET 4.7上,此属性的默认值应为SystemDefault(源),SystemDefault表示";询问OS关于默认协议的列表";(在Windows 10上启用了TLS 1.1和TLS 1.2)-此值仍然会受到多个外部源的影响(如注册表项,如您在上面看到的,甚至会受到安装的软件或应用的修补程序的影响)。正如我们在评论中所指出的,出于某种原因,默认情况下它是Ssl3 | Tls,这很糟糕,因为Ssl3甚至不安全,应该禁用。

因此,为了解决您的问题(以及在未来的此类情况下),请始终列出您需要的协议,特别是如果您在多台客户端机器上发布应用程序,因为默认设置不可靠:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

相关内容

  • 没有找到相关文章

最新更新