【问题标题】:Replace default TLS stack for OpenSSL in Windows替换 Windows 中 OpenSSL 的默认 TLS 堆栈
【发布时间】:2021-02-17 19:17:09
【问题描述】:

最近,我们在为客户安装我们的一个应用程序时遇到了问题。在安装过程中,应用程序需要向我们的云服务执行一些请求,我们意识到它无法建立 HTTPS 连接:TLS 握手失败了。经过一番研究,我们发现服务器是 Windows Server 2008,它不支持 TLS v1.2,这是连接到我们服务器所需的最低要求。有一些解决方法(例如this one),但都没有奏效。此外,由于客户政策,我们无法为该窗口安装任何更新。

在使用wireshark寻找解决方案时,我们注意到我们的程序尝试使用TLS v1.2进行连接并失败,但Chrome浏览器能够使用TLS v1.3连接到同一个云服务器,这甚至不是Windows Server 2008 支持。据此我们推断 Chrome 很可能使用自己的 TLS 堆栈来建立连接。

我想知道如果 Chrome 正在这样做,我们也应该能够这样做。该应用程序是在 .Net Core 中开发的,我在 Google 上搜索了很多关于如何执行此操作的信息,并且我发现了很多关于如何在 .Net Core 中配置 TLS 证书的信息,但没有关于用 TLS 堆栈替换的信息,比如说,OpenSSL 或其他。我确实知道这个is possible in Java,所以是否可以替换 .Net 核心中的 TLS 堆栈?

【问题讨论】:

  • 可能的替代方案:您能否在特殊服务器上启用 1.1 仅供这些落后客户使用,受 IPaddr 和/或时间限制,如果可用,可能还包括登录/用户,例如他们必须通知您“我们在接下来的 2 小时内需要来自 192.168.0.1 的低质量连接”,而您只启用它?或者,如果您有人在现场提出(并认可)请求?
  • @dave_thompson_085 是的,我们想到了,但我们的感觉是用户拥有动态 IP,是什么让这个解决方案更难操作。此外,给人的感觉是我们会找到更多这样的“传统”客户,我们正在寻找更明确的解决方案。还是谢谢!

标签: ssl .net-core openssl tls1.2


【解决方案1】:

.NET Core 本身不允许您插入自己的加密堆栈。

您指出 Bouncy Castle 是 Java 让您使用备用加密堆栈的一个示例;有a port of Bouncy Castle to C#/.NET as well。

他们的源代码有一个测试用例,演示了如何使用 Bouncy Castle 编写 TLS 客户端:

https://github.com/bcgit/bc-csharp/blob/master/crypto/test/src/crypto/tls/test/TlsClientTest.cs

【讨论】:

  • 这为我们提供了一种使用另一个堆栈建立 TLS 连接的方法,这很好。此外,我们需要在此基础上构建自己的 HTTPS 方法。你知道是否可以以某种方式覆盖System.Net.HttpClient,这样我们就不需要更改所有代码?我正在查看 [其代码](github.com/microsoft/referencesource/blob/master/System/net/…) 但我不确定是否可以替换建立连接的方式。
  • 在我上一条评论之后,可以“覆盖”System.Net.Http.HttpClient 的内部结构,将您自己的DelegatingHandler 实例传递给它的构造函数。在此处理程序中,您需要做的“唯一”事情是实现SendAsync 方法,以便它返回正确的HttpResponseMessage。这可以使用 libcurl 或其任何包装器在后台实现,这些包装器具有自己的加密 (OpenSSL),解决了问题,对现有代码的更改最少。
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2010-12-14
  • 2020-02-02
  • 2016-08-26
相关资源
最近更新 更多