关于c#:SoapHttpClientProtocol和TLS 1.2 – 客户端和服务器无法通信,因为它们没有通用的算法

SoapHttpClientProtocol and TLS 1.2 - The client and server cannot communicate, because they do not possess a common algorithm

关于这一点,有很多帖子在上面,我已经把它们搜遍了,但仍然没有解决的办法。我希望有人能给我指明正确的方向。

我们现在需要使用TLS 1.2连接到远程提供程序。因此,我安装了Windows Server 2016,并根据需要进行了配置:

enter image description hereenter image description here

我知道远程服务器正在运行TLS 1.2,并且它支持突出显示的密码。

我们使用提供者提供的WSDL生成的C代理类连接到远程端点,然后将其端转换为tls(system.web.services.protocols.soaphttpclientprotocol)。

当我使用代理进行连接时,会得到一个异常,内部异常是"客户机和服务器无法通信,因为它们不具有通用的算法"。

我看不到ServicePointManager.SecurityProtocol的任何地方,所以我假设.NET正在接收TLS 1.2,因为它是唯一启用的协议?不知道密码是怎么做的。

有人能告诉我如何解决这个问题吗?如果可能,我不想重新生成WSDL代理类。


如果客户端应用程序是根据.NET Framework 4.5.2或更低版本编译的,则默认情况下ServicePointManager.SecurityProtocol初始化为SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls(仅限于SSL 3.0和TLS 1.0),因此它将无法连接到需要TLS 1.2的远程服务器。

允许客户端应用程序使用TLS 1.2有几种方法:

  • 根据.NET Framework 4.6或更高版本重新编译客户端应用程序。(在Visual Studio中,打开项目的属性页,转到"应用程序"选项卡,然后更改目标框架。)
  • 在客户机上,运行regedit.exe,转到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319,添加一个名为SchUseStrongCrypto的dword(32位)值,并将其设置为1。(此标志使ServicePointManager.SecurityProtocol初始化为Tls | Tls11 | Tls12。)
  • 当客户端应用程序启动时,打开tls 1.2:ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

不需要重新生成代理类,因为它不负责协商TLS协议或密码。


我在从连接到Web服务的网站中删除TLS 1.0时遇到此问题。对我来说,它是一个httpruntime,卡在web服务的web.config中的4.5.1上。该服务已更改为4.6.1,将web.config中的httpruntime版本更改为4.6.1修复了该问题。该网站试图为Web服务设置TLS,但只有1.2和1.1可用。Web服务只支持1.0,因此导致了错误。