【问题标题】:Connecting to website with TLS 1.2 and specific cipher suites with MVC 5 application使用 TLS 1.2 和使用 MVC 5 应用程序的特定密码套件连接到网站
【发布时间】:2023-03-27 20:40:01
【问题描述】:

我有一个使用 NHtmlUnit 的 WebClient 连接到另一个网站的 MVC 5 应用程序,我在调试时无法建立该连接。

我要连接的网站需要以下协议和密码套件:

最初在尝试从目标站点连接和检索 HTML 时,我遇到了一个错误,指出: 致命警报:handshake_failure

为了解决这个问题,我现在在 WebClient 上指定 SLLClientProtocols 和 SSLClientCipherSuites 选项以包含上述协议和密码套件。但是现在我每次收到的错误是: 当前安装的提供程序无法支持 [密码套件]

我已将本地操作系统更新为 Server 2019 Datacenter(完全更新),我的理解是此操作系统版本应包括对 TLS 1.2 以及我需要的密码套件(或至少其中一个)的支持@ 987654321@.

最初位于 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols 的注册表没有 TLS 1.2 的密钥,因此我将其添加为 Client 和 Server 的子键,每个 DWORD 的“DisabledByDefault”设置为 0 和“启用”设置为 1。

我的项目面向 .NET Framework 4.7.2。我确保验证 system.web 下的 web.config 文件指定了编译和运行时的框架版本:

<system.web>
<customErrors mode="Off" />
<compilation debug="true" targetFramework="4.7.2" />
<httpRuntime targetFramework="4.7.2" maxRequestLength="1048576" executionTimeout="3600" />
<authentication mode="Forms">
  <forms name=".AuthCookie" loginUrl="~/Account/Login" />
</authentication>
<!--<authentication mode="None" />-->
<membership defaultProvider="ADMembershipProvider">
  <providers>
    <clear />
    <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" />
  </providers>
</membership>
<pages>
  <namespaces>
    <add namespace="GridMvc" />
  </namespaces>
</pages>
</system.web>

我还添加了以下内容来明确设置协议:

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

但这似乎没有帮助,因为我认为它正在强制 TLS 1.2,但错误似乎集中在密码套件上。如果没有这条线,我的理解是 ServicePointManager.SecurityProtocol 将默认为 SystemDefault 的值,这将允许应用程序使用底层操作系统 TLS 版本选择默认值。我的操作系统是否支持我想要的密码套件,但不是这些选择默认值的一部分?

这是我正在使用的代码,但目前无法使用:

NHtmlUnit.WebClient driver = new NHtmlUnit.WebClient(BrowserVersion.CHROME);
driver.Options.SSLClientProtocols = new String[] { "TLSv1.2" };
driver.Options.SSLClientCipherSuites = new string[] { "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" };
HtmlPage page = driver.GetHtmlPage(<website URL>);

在搜索我收到的错误消息时,我得到了很多关于 Java 的结果。我认为这是因为 NHtmlUnit 是 HtmlUnit 的 .NET 包装器,它是 Java 库的一部分。我看到 NHtmlUnit 使用了 OpenJDK,OpenJDK 是否有可能出现问题并且不支持“已安装的提供程序”?

任何帮助了解这里出了什么问题都将是一个巨大的帮助,谢谢。

编辑:我能够使用标准 System.Net.Http.HttpClient 获得我需要的请求和响应。这使我相信该错误与 NHtmlUnit 无关。

【问题讨论】:

  • TLS 在发送 HTTP 请求之前发生。客户端向服务器请求 TLS 版本。然后,服务器发送一个证书块,其中包含可以使用的证书名称。然后,客户端在商店中查找证书名称以找到证书。似乎 TLS 1.2 不支持从服务器发送到客户端的证书列表。早期版本的 Net 不支持 TLS 1.2 的所有加密模式。 Net 4.7.2 默认使用 TLS 操作系统。较旧的移动设备可能需要更新以支持 TLS 加密模式。
  • 您可以使用诸如wireshark或fiddler之类的嗅探器来验证TLS模式并获取从服务器发送到客户端的证书名称列表。

标签: c# asp.net-mvc encryption tls1.2 nhtmlunit


【解决方案1】:

之后:WebClient 客户端 = new WebClient(); 添加此行以强制它使用 TLS1.2 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

【讨论】:

  • 如果您使用的是 4.5 框架,它不会自动默认为 TLS 1.2,但它是可用的。
  • 您好 T Christopher,不幸的是,这并没有帮助,因为根据错误消息,即使使用 TLS 1.2 似乎也存在密码套件错误。
猜你喜欢
  • 2018-10-12
  • 2018-12-11
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多