【发布时间】: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