C# 多线程SSL/TLS版本切换

C# 多线程SSL/TLS版本切换,c#,asp.net,.net,asp.net-mvc,wcf,C#,Asp.net,.net,Asp.net Mvc,Wcf,我们的Wcf服务(核心服务)由asp.net mvc使用。此核心服务与其他第三方服务集成以实现某些用例。所有这些第三方服务端点都是通过https公开的,但在受支持的SSL/TLS版本(1.0,1.1,1.2)上有所不同 我们对此没有太多控制权,只是在连接任何给定的第三方服务之前坚持使用特定(受支持的)SSL/TLS版本。i、 e.每当核心服务想要使用任何第三方服务时,它都会将ServicePointManager.SecurityProtocol设置为受支持的SSL/TLS版本(第三方要求我们使

我们的
Wcf
服务(核心服务)由
asp.net mvc
使用。此核心服务与其他第三方服务集成以实现某些用例。所有这些第三方服务端点都是通过https公开的,但在受支持的SSL/TLS版本(1.0,1.1,1.2)上有所不同

我们对此没有太多控制权,只是在连接任何给定的第三方服务之前坚持使用特定(受支持的)SSL/TLS版本。i、 e.每当核心服务想要使用任何第三方服务时,它都会将
ServicePointManager.SecurityProtocol
设置为受支持的SSL/TLS版本(第三方要求我们使用x.x或更高版本进行连接)

问题:

  • 如何重新实现上述TLS版本切换逻辑工作 在多线程环境中实现无缝连接

  • 我设法编写了逻辑,通过
    ServicePointManager.SecurityProtocol
    属性上的锁同步访问。但是此尝试会影响其他连接的客户端的性能(当它们使用任何其他第三方产品/服务时)

    您可以指定Tls的多个版本,以便在运行时不需要更改它。下面的代码表示它支持
    TLS1.0
    TLS1.1
    TLS1.2

    如果客户端支持
    TLS1.2
    或更低版本,则使用
    TLS1.2
    创建连接

    如果客户端支持
    TLS1.1
    或更低版本,则使用可用的最高安全协议
    TLS1.1

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

    提前谢谢你的回答。但我不清楚这在多线程场景中如何工作,因为ServicePointManager.SecurityProtocol是一个静态(应用程序域/gloabl范围内)变量。您能进一步解释一下这种方法对我有什么帮助吗。@Nair多线程与使用的协议版本无关<代码>ServicePointManager.SecurityProtocol是允许的最低TLS版本。客户端和服务器都从最高层开始协商版本,比如说,我有两个服务A和B,其中A支持的最大TLS版本为1.0,B支持的最大TLS版本为1.2。现在,如果我的核心服务并行调用服务A&B,其中A先被调度(执行),然后是B。在这种情况下,很可能会出现数据争用问题(versions字段是静态的)。因此,现在的TLS版本可能是1.2,当我们将数据上传/发布到第三方服务器时,它将不受支持。2@RawitasKrungkaew,答案是可以接受的。我在切换和版本协商上有一个错误的想法,因此有点混乱。谢谢。多线程不会影响TLS的工作方式
    ServicePointManager.SecurityProtocol
    是您愿意接受的TLS版本的标志。服务器和客户端将协商并选择双方都可以接受的最高版本。顺便说一句,您至少需要TLS11。1.0被认为是不安全的。除非另一方有很重要的理由在短时间内降级,否则你应该考虑要求TLS12。航空公司、银行、谷歌等已经要求TLS1.2
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;