c# - WCF net.tcp SSL : none of the cipher suites supported by the client application are supported by the server

标签 c# web-services wcf ssl tcp

我有两台 PC,我们称它们为 PC1 和 PC2。

我编写了一个服务端应用程序,它打开一个自托管的 WCF net.tcp 端点,使用 X509 证书进行保护。我用于传输安全的证书是“颁发给”一个任意名称,例如:MY-TEST-SERVICE。

我还编写了一个客户端应用程序来与服务对话。它知道并指定服务将提供的 DnsIdentity (MY-TEST-SERVICE),它使用服务用于传输安全的相同 X509 证书。

当我在 PC1 上运行客户端时,它与 PC1 和 PC2 上的服务一起工作。

当我在 PC2 上运行客户端时,它与 PC1 上的服务一起工作,但与 PC2 上的服务的 SSL 握手失败。

在 PC2 上打开 WCF 客户端跟踪,然后成功连接到 PC1 上的 protected net.tcp 服务,但无法连接到 PC2 上的 protected net.tcp 服务,我可以准确地看到是哪一步失败了。

从 PC2 到 PC1 的成功握手的跟踪报告: - 为端点引用确定身份 - 身份验证成功

从 PC2 到 PC2 的失败握手的跟踪报告: - 套接字连接被中止。这可能是由于... - 抛出异常

为什么身份验证过程会失败,但只有当客户端和服务都在 PC2 上执行时才会失败?

最佳答案

我们最终在没有更改代码中的任何内容的情况下找到了问题(我不知道它是否适用于您的具体情况)- 在我们的案例中它只是在一天开始时没有任何代码更改。

我们发现安装了 kb3102467 的 Windows 更新 - 这是 .NET Framework 4.6.1,我们最终会使用它,并且可能会在每个人的机器上找到它。

问题似乎是 TLS 1.2 不再支持 SHA512,因为它会导致 CPU 使用率过高。我们可能需要为客户端和服务器颁发新的 SSL 证书。

作为解决方法,我们禁用了 TLS 1.2:

  1. 启动 regedit 并浏览到以下位置:HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols
  2. 在协议(protocol)下创建以下 key :TLS 1.2
  3. 在 TLS 1.2 下创建以下两个 key :客户端和服务器
  4. 在客户端和服务器 key 下创建以下 DWORD:DisabledByDefault 和 Enabled
  5. 在客户端和服务器下设置如下:DisabledByDefault=1 和 Enabled =0
  6. 重启服务器。

这解决了我们的问题,同时机器上仍然安装了 .NET F/W 4.6.1。

关于c# - WCF net.tcp SSL : none of the cipher suites supported by the client application are supported by the server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32124040/

相关文章:

c# - 为什么 HttpCookieCollection.Get 从手动实例化的对象(而不是当前的 HttpContext)调用时返回 null

c# - 什么时候需要数字后缀 L(长)?

web-services - 压缩jQuery的Web服务响应

java - 如何在WildFly(耳朵中)中配置EJB WebServices

c# - 自宿主 WCF ServiceHost 对象生存期

wcf - 从 WSDL 使用 WCF 托管服务 - SVCUtil 为方法生成详细类型

c# - 使用查询字符串参数消除 UriTemplate 匹配项的歧义

c# - C# 退出时自动保存设置

c# - 在 C# 中用多个 Char 分割字符串

tomcat - axis2 网络服务中使用的计时器类