我有一个使用 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 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 无关。