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,并根据需要进行了配置:
我知道远程服务器正在运行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初始化为
允许客户端应用程序使用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,因此导致了错误。