2017-02-23 463 views
7

有很多关于这个的帖子,我已经检查了他们,但仍然没有解决方案。我希望有人能够指引我走向正确的方向。SoapHttpClientProtocol和TLS 1.2 - 客户端和服务器无法通信,因为它们不具有通用算法

我们现在需要使用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支持至关重要:http:// stackoverflow。com/questions/28286086/default-securityprotocol-in-net-4-5/28502562#28502562 –

回答

9

如果您的客户端应用程序是针对.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。
  • 当你的客户端应用程序启动时,打开TLS 1.2(此标志导致ServicePointManager.SecurityProtocol被初始化为Tls | Tls11 | Tls12):ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

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

+0

完美@Michael。我已经改变了对4.6.1进行编译,但也意识到我必须将httpRuntime targetFramework更改为4.6.1,因为WebApi最终会建立连接,我相信它可以避免注册表更改?执行httpRuntime更改后,连接TLS 1.2。 – TheEdge

0

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