C# 在winform应用程序中指定要使用的多个SSL协议会在调用TLS1.0服务器的webservice时导致异常

C# 在winform应用程序中指定要使用的多个SSL协议会在调用TLS1.0服务器的webservice时导致异常,c#,winforms,web-services,ssl,.net-4.5,C#,Winforms,Web Services,Ssl,.net 4.5,我有一个基于.NETFramework4.5构建的winform应用程序。我希望我的应用程序支持多种ssl协议,因此我添加了以下代码: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls |

我有一个基于.NETFramework4.5构建的winform应用程序。我希望我的应用程序支持多种ssl协议,因此我添加了以下代码:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | 
                                                  SecurityProtocolType.Tls |
                                                  SecurityProtocolType.Tls11 |
                                                  SecurityProtocolType.Tls12 ;
但是当我使用TLS1.0调用托管在服务器上的Web服务时。我得到以下例外情况:

请求被中止:无法创建SSL/TLS安全通道

我尝试了不同的SSl协议组合,但在三种情况下都有效

  • 我没有指定任何协议

  • System.Net.ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls

  • System.Net.ServicePointManager.SecurityProtocol=SecurityProtocolType.SSl3 | SecurityProtocolType.Tls

  • 那么,这是服务器的问题吗?还是我做错了什么?
    另外,如果我没有指定任何SSL协议,它是否能够使用TLS1.1和TLS1.2调用托管在服务器上的Web服务?请记住,我的应用程序是基于.net framework 4.5构建的,默认情况下支持TLS 1.0。

    请注意,SSL/TLS支持完全取决于绑定到Windows版本的SChannel系统组件。默认值为
    Ssl3 | Tls
    ,因此1)和3)相同。根据我的经验,似乎不能同时指定TLS的多个版本,因为它们不兼容。根据您的要求,要么只使用TLS 1.2(最安全的ATM),要么在1.2失败时尝试1.0回退。如果我只指定Tls1.2和TLS 1.1,它会支持这两种协议吗?据我所知,不会。整个情况有点烦人:/it's令人沮丧,如果他们允许我们指定多个协议,那么他们也应该支持多个协议。不,难怪大多数大公司使用基于Java的框架。问题是,从安全角度来看,这是一件好事。你不应该能够重新协商,因为这会破坏你从一开始就尝试使用更安全的协议所获得的所有优势。如果你和目标服务器之间有人,他当然会假装只支持SSL3,这样做会更容易进行MITM攻击。SSL/TLS在很大程度上是围绕信任构建的——如果您甚至不知道目标服务器是否支持TLS 1.2,那么您就输了一半。