每个请求更改安全协议(HttpClient)

Por*_*iey 15 c# ssl http asp.net-web-api

我有一个Web API,必须与几个不同的服务进行通信.目前,我将Web API设置为使用以下安全协议:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

当API通过HttpClient(比如Twitter)调用另一个服务时,它将使用该协议.然而,与此同时,另一个请求可能会从云访问某些内容,无论出于何种原因,目前需要TLS(而不是TLS 1.2).在发出之前,对云的请求再次设置安全协议:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

我遇到的问题是当两个独立且唯一的请求进入时,一个用于Twitter,一个用于云,安全协议可能在发送之前切换到"错误的",导致请求失败.

有没有办法在HttpClient每个请求上设置安全协议,这样我就不会在某个单独的某个地方交换设置?

小智 13

您无需进行设置.

您可以使用:

using System.Net;
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

补充说明:

  • 需要.Net 4.5,因为Tls12不是默认协议.
  • 需要在应用程序中只编写一次上面的代码.(例如,在Web应用程序中的Global.asax> Application_Start或Winforms应用程序中的等效项)
  • 对于.Net 4.6及更高版本,Tls12是默认协议,因此不需要它

  • 我不确定 .Net 4.6 及更高版本不需要指定 Tls12 是否正确。我正在使用 .Net 4.8,其中我向需要 Tls12 的 API 发送异步请求。如果我不设置 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12,请求将失败并显示“无法创建 SSL/TLS 安全通道”。设置 Tls12 后,它可以正常工作。 (2认同)

usr*_*usr 5

似乎没有办法做到这一点。该SecurityProtocol属性仅在内部TlsStream类中的某个位置使用:

在此处输入图片说明

TlsStream 似乎支持所有内部TLS连接,例如HTTP,FTP和SMTP。

我曾经希望ServicePoint您可以配置它。对于许多设置,ServicePointManager仅提供默认设置。那个希望是没有根据的。

因此,这有力的证据证明这是不可能的。不过,这还没有证据。

你该怎么办?我将关闭您正在与之通信的奇数服务器的HTTP客户端库。HTTP不是特别复杂的协议。我确定还有其他一些实现。

或者,使用代理来终止您自己服务器上的HTTPS连接。.NET然后仅处理HTTP。