繁体   English   中英

使用 TLS 1.2 和使用 MVC 5 应用程序的特定密码套件连接到网站

[英]Connecting to website with TLS 1.2 and specific cipher suites with MVC 5 application

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

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

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

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

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

最初 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols 的注册表没有 TLS 1.2 的密钥,所以我添加了客户端和服务器的子键,每个子键的“DisabledByDefault”设置为 0 和“启用”设置为 1。

我的项目针对 .NET 框架 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 无关。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM