我有两台 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:
- 启动 regedit 并浏览到以下位置:HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols
- 在协议(protocol)下创建以下 key :TLS 1.2
- 在 TLS 1.2 下创建以下两个 key :客户端和服务器
- 在客户端和服务器 key 下创建以下 DWORD:DisabledByDefault 和 Enabled
- 在客户端和服务器下设置如下:DisabledByDefault=1 和 Enabled =0
- 重启服务器。
这解决了我们的问题,同时机器上仍然安装了 .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/