【发布时间】:2015-08-20 16:55:46
【问题描述】:
我有两台电脑,我们称它们为 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 上执行时?
【问题讨论】:
-
是本地计算机 > 受信任的人存储和本地计算机 > PC2 上的个人存储中的证书吗?
-
是的。我用于客户端和服务器的证书位于本地计算机个人中,其 CA 位于本地计算机受信任的根目录中,PC1 和 PC2 都是这种情况。证书有一个私钥,并且验证了 CA 的路径。
-
深入挖掘,我在系统事件日志中看到一个 Schannel 事件:“从远程客户端应用程序接收到一个 TLS 1.2 连接请求,但客户端应用程序支持的密码套件都不支持服务器。SSL 连接请求失败。”最后,我看到了实际的问题......但是在同一台PC上执行的服务和客户端怎么会这样不一致呢?!
-
@MikeZ 你能找到解决这个问题的方法吗?我们现在面临同样的事情。
-
@developer82 很抱歉耽搁了...我刚刚看到您的问题...我将 SecurityMode 从 Transport 更改为 Message。
标签: c# web-services wcf ssl tcp