2008 R2服务器,设置SSL密码套件顺序后,应用程序出现未能创建 SSL/TLS 安全通道

584

System.Net.WebException

请求被中止: 未能创建 SSL/TLS 安全通道。

解决方案

注意1:仅当远程服务器配置了具有ECDSA(非RSA)签名的SSL密钥,但客户端PC配置为支持的所有cipher_suites均为RSA(非ECDSA)时,此解决方案才有用。

注意2:如果您是在2016年8月之后阅读此文章,请检查并确保您添加的新cipher_suites值仍然是加密有效的值。这些事情会随着时间而改变!

注意3:除非您知道自己在做什么,否则不要使用注册表编辑器(如此处建议)。它会永久损坏您的PC。

在我的情况下,问题是由客户端支持的cipher_suites集与服务器能够接受的值集之间不匹配引起的。具体地说,在我的情况下,服务器具有一个用ECDSA(不是RSA)签名的SSL密钥,而我有问题的客户端PC被配置为仅使用ECDSA(不是RSA)cipher_suites。在最初的“客户端问候”步骤之后,这导致SSL握手失败。

我可以通过将ECDSA值添加到客户端PC的cipher_suites集来解决此问题:

在客户端PC上:

  1. 打开注册表编辑器。
  2. 导航到HKLM / SOFTWARE / Policies / Microsoft / Cryptography / Configuration / SSL / 0010002
  3. 编辑现有的逗号分隔值,并在客户端操作系统支持的末尾添加一个新值,该值是加密安全的,并且可以使用带有ECDSA签名的密钥。我使用的值:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256
  4. 重启。

解决方案出处

国外某个技术博主给出的解决方案

stackoverflow上关于此问题的描述

可能的原因

客户端和服务器必须在“密码套件”上达成共识。在SSL连接的“握手”阶段,客户端将列出服务器支持的密码套件,以对照自己的列表进行检查。但是在某些Windows机器上,某些通用密码套件可能已被禁用(似乎是由于故意限制攻击面的企图),从而降低了客户端和服务器就密码套件达成协议的可能性。如果他们不同意,那么您可能会在事件查看器中看到“致命警报代码40”,并在.NET程序中看到“未能创建 SSL/TLS 安全通道”。