使用 netTcpBinding 为 WCF 服务启用基于证书的身份验证

Posted

技术标签:

【中文标题】使用 netTcpBinding 为 WCF 服务启用基于证书的身份验证【英文标题】:Enabling certificate based authentication for WCF service using netTcpBinding 【发布时间】:2011-11-03 15:15:31 【问题描述】:

我有一个 WCF 服务,它使用带有 netTcpBinding 的单个端点公开,该端点位于 Server A 上,托管在我们域的内部 LAN 上的 IIS7.5/WAS 上。

然后,此服务由位于 Server B 上的 ASP.NET Web 客户端应用程序使用,该应用程序也托管在 IIS7.5 上,由我们域之外的外部托管提供商提供,并通过链接到我们的 LAN一个安全的 ***,只允许 服务器 A服务器 B 之间的通信。

在开发过程中,当我测试这个概念时,我使用绑定安全mode="Transport" 和传输clientCredentialType="Windows" 在我们域内部的另一个 IIS 服务器上运行 Web 客户端应用程序,效果很好。

然后,我将 Web 客户端应用程序移至外部 服务器 B 以进行进一步的概念验证测试,设置绑定安全性mode="None",显然该服务器不在我们的域中,我不能使用 Windows 身份验证,它仍然可以正常工作。

我现在需要做的,要启用切换回使用传输安全性是设置clientCredentialType="Certificate",因为clientCredentialType="None" 不能具有传输安全性。

这就是我开始陷入困境的地方。关于服务的web.config 和客户端web.config 定义证书的位置以及存储证书的哪些位,我似乎在绕圈子。

基本上我要做的是验证 Server B 确实是 Server B 调用 Server A 上的服务,从而防止任何欺骗或 DNS 颠覆问题,这可能导致 Server A 上的服务被非法访问。

我的想法是,我需要为 Server B 创建一个证书,Server A 持有公钥来验证它?如果是这种情况,服务器 B 已经安装了通配符 SSL 证书,因为它作为子域服务于我们的各种应用程序。此证书可以用于 WCF 身份验证吗?

我发现的所有 SO 问题似乎都没有涵盖这一点,而且我发现的所有各种网站和书籍示例都不是那么清楚。它开始看起来像 WCF 配置有点黑艺术。

这一切都是使用 .NET 4 和 Visual Basic 构建的。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

MSDN example 提供了如何在代码和配置中使用证书配置 netTcpBinding 的示例。只需选择适合您的场景即可。证书应由 VeriSign 或 Thwate 等公共(商业)证书颁发机构颁发,以便您的外部主机提供商和内部服务器信任它。

【讨论】:

感谢您的链接。我对消息安全性并不感兴趣,因为只有点对点的传输安全性就足够了。所以我假设我可以将链接的示例修改为仅使用 mode="Transport"。我是否认为需要将服务的端点行为中定义的证书安装在服务器 A(带有服务)上,然后将客户端 web.config 中定义的证书安装在服务器 B(带有客户端应用程序)上?如果证书是由受信任的 CA 颁发的,我还需要在对端服务器上安装公钥吗? 是的,netTcpBinding 只能配置为传输模式。证书将需要安装在两台服务器上。托管服务提供商可能希望自己完成或允许您安装它。服务器 B 上的 web.config 将仅引用主机提供商为其服务器指定的任何证书存储。 好的。托管服务器是具有 RDP 访问权限的专用服务器,因此我可以添加所需的任何证书。托管服务器已经安装了用于托管 IIS 站点的通配符证书。我假设这可以用于客户端应用程序。但是内部服务器(服务器 A)需要它自己的证书,然后需要安装在对方服务器上的两个证书的公钥?还是不需要公钥位? WCF 客户端(服务器 B)和服务(服务器 A)都需要引用 same 证书(分别安装在每台机器上)。这个MSDN example 显示了如何为具有传输安全性的 netTcpBinding 配置客户端证书。服务将被类似地设置,除了证书将在 serviceBehaviors 元素而不是 endpointBehaviors 元素中配置。 WCF 处理获取公钥等,只要它指向正确的证书。 啊,这更有意义。让我来设置一下,我会回复你的。

以上是关于使用 netTcpBinding 为 WCF 服务启用基于证书的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NetTcpBinding (WCF) 找到可用的 TCP 端口(以便服务器可以绑定到它)

使用 netTcpBinding 时,在 WCF 中实现加密的最简单方法是啥?

在 WCF-netTCPBinding 中测试 TLS 安全性

使用 netTcpBinding 的慢(ish)WCF 连接速度

netTcpBinding 或 wsHttpBinding

您可以将 WCF 数据服务(ne OData、ne Astoria、ne ADO.NET 数据服务)与 NetTcpBinding 一起使用吗?