2008 R2服务器,设置SSL密码套件顺序后,应用程序出现未能创建 SSL/TLS 安全通道
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上:
- 打开注册表编辑器。
- 导航到
HKLM / SOFTWARE / Policies / Microsoft / Cryptography / Configuration / SSL / 0010002
- 编辑现有的逗号分隔值,并在客户端操作系统支持的末尾添加一个新值,该值是加密安全的,并且可以使用带有ECDSA签名的密钥。我使用的值:
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256
- 重启。
解决方案出处
可能的原因
客户端和服务器必须在“密码套件”上达成共识。在SSL连接的“握手”阶段,客户端将列出服务器支持的密码套件,以对照自己的列表进行检查。但是在某些Windows机器上,某些通用密码套件可能已被禁用(似乎是由于故意限制攻击面的企图),从而降低了客户端和服务器就密码套件达成协议的可能性。如果他们不同意,那么您可能会在事件查看器中看到“致命警报代码40”,并在.NET程序中看到“未能创建 SSL/TLS 安全通道”。