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

12

关于这个问题,SO上有很多帖子,我已经仔细查看了它们,但仍然没有解决方案。我希望有人可以指点我正确的方向。

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

enter image description here enter image description here

我知道远程服务器正在运行TLS 1.2,并支持突出显示的密码。我们使用提供程序提供的WSDL生成的C#代理类连接到远程终端点 - 在他们将其端口转换为TLS之前(System.Web.Services.Protocols.SoapHttpClientProtocol)。当我使用代理连接时,我会收到一个异常,其中内部异常是“客户端和服务器无法通信,因为它们没有共同的算法”。我无法看到任何ServicePointManager.SecurityProtocol,所以我假设.NET正在选择TLS 1.2作为唯一启用的协议?不知道它如何进行加密。有人能告诉我如何尝试修复这个问题吗?如果可能,我不想重新生成WSDL代理类。

2
你正在运行哪个版本的.NET框架?你的应用程序是如何配置的?你说的“我无法在任何地方看到ServicePointManager.SecurityProtocol”是什么意思?这对于TLS 1.2支持非常重要:https://dev59.com/vV4c5IYBdhLWcg3wHXNS#28502562 - Simon Mourier
2个回答

31
如果您的客户端应用程序是针对.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协议或密码。

完美@Michael。我已经改为编译4.6.1,但后来意识到我必须将httpRuntime targetFramework更改为4.6.1,因为连接最终是由WebApi进行的,我相信这可以避免注册表更改?进行httpRuntime更改使连接TLS 1.2。 - TheEdge
@MichaelLiu 我已经做了这一切,但我的 SSLStream 仍然失败。我需要更新 SSLstream 的特定内容吗? - Peru
有没有通过Web/App配置文件来完成这个的方法? - ullfindsmit
1
@Peru,关于SslStream,“使用SslStream AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean)重载的应用程序可以将SslProtocols值设置为...” (SslProtocols)0x00000C00,参考https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-net-framework。 - Mike Henry
对我来说,ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 这行代码也是解决我的 VSTO AddIn(Excel)无法再与 Microsoft.Identity.Client 连接到 Azure AD 的方案。 - gridr

1
我曾经遇到过一个问题,需要从一个连接到Web服务的网站中删除TLS 1.0。对我而言,问题出在Web服务的web.config文件中httpRuntime被卡在了4.5.1版本上。将服务更改为4.6.1,并将web.config中的httpRuntime版本更改为4.6.1即可解决该问题。网站尝试设置与Web服务的TLS,但只有1.2和1.1可用。Web服务仅支持1.0,这导致了错误的发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接