WCF net.tcp SSL:服务器

时间:2015-08-20 16:55:46

标签: c# web-services wcf ssl tcp

我有两台电脑,我们称之为PC1和PC2。

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

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

当我在PC1上运行客户端时,它适用于PC1和PC2上的服务。

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

在PC2上启用WCF客户端跟踪,然后成功连接到PC1上的安全net.tcp服务,并且无法连接到PC2上的安全net.tcp服务,我可以确切地看到哪个步骤失败。

成功握手的追踪,从PC2到PC1,报告: - 确定端点参考的身份 - 身份验证成功

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

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

2 个答案:

答案 0 :(得分:1)

我们最终发现问题(我不知道它是否适用于您的确切情况)而不更改我们的代码中的任何内容 - 在我们的情况下,它只是在没有任何代码更改的情况下开始了一天。

我们发现安装了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. 在协议下创建以下密钥:TLS 1.2
  3. 在TLS 1.2下创建以下两个密钥:客户端和服务器
  4. 在客户端和服务器密钥下创建以下DWORD:DisabledByDefault和Enabled
  5. 在客户端和服务器下,设置以下内容:DisabledByDefault = 1和Enabled = 0
  6. 重新启动服务器。
  7. 这解决了我们的问题,同时仍然在机器上安装了.NET F / W 4.6.1。

答案 1 :(得分:0)

将客户端和服务上的SecurityMode从Transport更改为Message已解决了原始问题,所有客户端现在都可以使用所有服务。

这对我来说没有意义,但无论如何,我有一个解决方案。

相关问题