Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SoapHttpClientProtocol和TLS 1.2-客户端和服务器无法通信,因为它们没有通用的算法_C#_Ssl_Wsdl - Fatal编程技术网

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

C# SoapHttpClientProtocol和TLS 1.2-客户端和服务器无法通信,因为它们没有通用的算法,c#,ssl,wsdl,C#,Ssl,Wsdl,有很多关于这方面的帖子,我已经搜索过了,但仍然没有解决办法。我希望有人能给我指出正确的方向 我们现在需要使用TLS1.2连接到远程提供商。因此,我安装了Windows Server 2016,并根据需要进行了配置: 我知道远程服务器正在运行TLS 1.2,并且它支持突出显示的密码 我们使用由提供者提供的WSDL生成的C#代理类连接到远程端点,然后将其端转换为TLS(System.Web.Services.Protocols.SoapHttpClientProtocol) 当我使用代理连接时,

有很多关于这方面的帖子,我已经搜索过了,但仍然没有解决办法。我希望有人能给我指出正确的方向

我们现在需要使用TLS1.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或更低版本编译的,则默认情况下初始化为
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\u LOCAL\u 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时,我遇到了此问题。 对我来说,它是一个停留在web服务的web.config中的4.5.1上的httpRuntime。该服务已更改为4.6.1,将web.config中的httpRuntime版本更改为4.6.1修复了该问题。
该网站试图将TLS设置为web服务,但只有1.2和1.1可用。web服务仅支持1.0,因此导致错误

您正在运行哪个版本的.NET framework?你的应用程序是如何配置的?“我在任何地方都看不到ServicePointManager.SecurityProtocol”是什么意思?这对于TLS1.2支持来说至关重要:完美@Michael。我已经更改为针对4.6.1进行编译,但也意识到我必须将httpRuntime targetFramework更改为4.6.1,因为连接最终是由WebApi进行的,我相信这可以避免注册表更改?进行httpRuntime更改使连接TLS1.2。@MichaelLiu我已经完成了所有这些,但我的sslStream仍然失败。对于SSLstream,是否有任何特定的内容需要更新?是否有办法通过web/app config文件进行更新?@Peru,关于SSLstream,“使用
SSLstream AuthenticateTasClient(String,X509CertificateCollection,SslProtocols,Boolean)的应用程序可以将
SslProtocols
值设置为…”
(SslProtocols)0x00000C000。