【问题标题】:Changing security protocol per request (HttpClient)更改每个请求的安全协议 (HttpClient)
【发布时间】:2015-01-14 22:32:24
【问题描述】:

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

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

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

【问题讨论】:

  • 对于遇到此问题但仍然卡住的任何人,我决定使用 AppDomain 将请求隔离到奇数服务器,从而为每个请求启用安全协议切换。 superstarcoders.com/blogs/posts/…
  • Porschiey,您的示例没有使用 HttpClient 显示这一点,这不是一个简单的类。请给个具体的例子使用HttpClient好吗?

标签: c# http ssl asp.net-web-api


【解决方案1】:

你不需要设置它。

你可以使用:

using System.Net;
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

补充说明:

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

【讨论】:

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

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

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

我曾希望ServicePoint 允许您进行配置。对于许多设置ServicePointManager 仅提供默认值。这种希望是没有根据的。

所以这是非常有力的证据,证明这是不可能的。不过,这没有任何证据。

你应该怎么做?我会为您正在与之交谈的奇怪服务器切换 HTTP 客户端库。 HTTP 不是一个特别复杂的协议。我确定还有其他可用的实现。

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

【讨论】:

  • 感谢您对此进行调查。不幸的是,奇怪的服务器连接(云)被嵌入到 SDK 中,我什至无法访问所使用的方法,更不用说知道它的 HttpClient 是否需要大量工作来重新工作我的其他连接使用不同的客户端 - 我更喜欢使用 HttpClient ......也就是说,我很欣赏这个答案,它非常有帮助! :)
猜你喜欢
  • 1970-01-01
  • 2014-06-24
  • 2014-11-27
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多