多线程SSL / TLS版本切换

时间:2018-01-04 11:33:38

标签: c# asp.net .net asp.net-mvc wcf

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

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

    // brief expression of logic which switch TLS version 1.2
    var currentSecurityProtocol = ServicePointManager.SecurityProtocol; // get the current security protocol.
    try
    {

        ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        //now get/post data to/from third party service
    }
    catch (Exception ex)
    {
       //report it
    }
    finally
    {
        ServicePointManager.SecurityProtocol = currentSecurityProtocol;
        ServicePointManager.ServerCertificateValidationCallback = null;
    }

问题:

  1. 如何重新实现上述TLS版本切换逻辑才能工作 无缝地在多线程环境中?
  2. 我设法编写逻辑,通过ServicePointManager.SecurityProtocol属性上的锁来同步访问。但是这种尝试会影响其他连接客户端的性能(当他们使用任何其他第三方产品/服务时)

1 个答案:

答案 0 :(得分:1)

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

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

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

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