2017-10-18 64 views
3

我试图做HTTPS GET使用客户端证书认证请求的响应创建SSL通道和它失败.NET 4.7失败时服务器TLS 1.1

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)?

+1

集SecurityProtocol到SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12? – Evk

+0

您在运行此代码的机器上安装的Windows版本是什么? – Evk

+0

Windows 10 15063.608 – Giedrius

回答

2

ServicePointManager.SecurityProtocol说明中指出

注意,没有默认值列出该属性,故意的。 安全格局不断变化,默认协议和 保护级别随着时间的推移而变化,以避免已知的缺陷 。默认值将根据个人计算机的配置,以及安装哪些软件和哪些 补丁已应用而有所不同。

您的代码不应该隐含地依赖于使用特定保护级别的 ,或者假定默认情况下使用给定的 安全级别。如果您的应用程序依赖于使用特定安全级别,则必须明确指定该级别并 ,然后检查并确保它在已建立的 连接上实际使用。此外,您的代码应该被设计为在支持协议的变化中保持健壮,因为这样的变化通常是在几乎没有预先通知的情况下做出的,以便减轻新出现的 威胁。

虽然在.NET 4.7这个属性的默认值应该是SystemDefaultsource)和SystemDefault意思是 “问OS有关的默认协议列表”(和Windows 10 TLS 1.1和TLS 1.2是enabled) - 此值仍然会受到多个外部源(如注册表项的影响,正如您在上面所看到的,即使安装了软件或应用的修补程序)。正如我们在评论中发现的那样,出于某种原因,您默认为Ssl3 | Tls,这很糟糕,因为Ssl3甚至不安全,应该禁用。

所以解决您的问题(并在将来这种情况下) - 你所需要的,特别是如果你发布你在多个客户机应用程序了总是名单的协议,因为默认设置是不可靠的:

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

此外它看起来像在Windows 10与.net 4.7的相同问题在这里提到:https://stackoverflow.com/questions/44751179/tls-1-2-not-negotiated-in-net-4-7-without -explicit-servicepointmanager-security/44765698#44765698 – Giedrius

+0

@Giedrius的确如此。但这似乎并不一致。例如,我具有与您相同的Windows版本,但在.NET 4.7上默认情况下为SystemDefault – Evk

相关问题