SoapHttpClientProtocol和TLS 1.2 - 客户端和服务器无法通信,因为它们没有通用的算法

The*_*dge 9 c# ssl wsdl

关于这一点有很多帖子,我已经搜索过它们,但仍然没有解决方案.我希望有人可以指出我正确的方向.

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

在此输入图像描述 在此输入图像描述

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

我们使用由提供程序提供的WSDL生成的C#代理类连接到远程端点 - 然后将它们的结尾转换为TLS(System.Web.Services.Protocols.SoapHttpClientProtocol).

当我使用代理连接时,我得到一个异常,内部异常是"客户端和服务器无法通信,因为它们没有通用算法".

我无法看到ServicePointManager.SecurityProtocol的任何地方,所以我假设.NET正在拿起TLS 1.2,因为它是唯一启用的协议?不知道它是如何做密码的.

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

Mic*_*Liu 20

如果您的客户端应用程序是针对.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,添加一个名为DWORD(32位)的值SchUseStrongCrypto,并将其设置为1.(此标志导致ServicePointManager.SecurityProtocol初始化为Tls | Tls11 | Tls12.)
  • 启动客户端应用程序时,启用TLS 1.2: ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

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