WCF NetTcpBinding 安全性 - 它是如何工作的?

Posted

技术标签:

【中文标题】WCF NetTcpBinding 安全性 - 它是如何工作的?【英文标题】:WCF NetTcpBinding Security - how does it work? 【发布时间】:2011-02-01 22:51:10 【问题描述】:

我在尝试解决 WCF 中设置的泥潭时遇到了以下问题...

我使用 NetTcp 绑定创建了 WCF 客户端-服务器服务。我没有对安全设置进行任何更改,并且在一台机器上运行时它运行得非常好。但是,当我从另一台机器上运行我的客户端时,它抱怨服务器不喜欢发送的安全凭据。

我了解现在 NetTCP 默认是“安全的”,我的客户端会传递错误的安全细节 - 即 Windows 用户名和密码(或某种形式的域身份验证)到我的服务器,因为它们没有在它不喜欢的同一个域上运行。

但是,我不明白的是:

我没有在绑定中指定任何安全性 - 标准设置是否需要发送 Windows 用户名或密码?

我的服务器上没有安装任何证书 - 我知道 NetTCP 绑定需要某种形式的公共私钥来保护凭据 - 但是当客户端和服务器都在同一台机器上时这似乎有效 - 如何数据被加密?或者想要它,因为 WCF 知道它在同一台机器上并且不需要加密?

我现在必须将我的客户端和服务器上的安全模式设置为“无”,它们可以很好地连接。但是有没有办法在没有证书的情况下加密我的数据?

最后...传输和消息安全之间有什么区别?

为了检查我的理解(请原谅这种情况!)消息安全性就像我将 A 人的一封信发送给 B 人,然后我对我的手写内容进行编码以确保如果有人截获它,他们就无法阅读它?运输安全是如果我决定让我的信由武装运输工具发送,这样沿途就没有人可以拿到它?

是否可以在没有证书的情况下在 WCF 中进行任何形式的加密?我的项目是一个私人项目,我不想购买证书,而且数据也不是那么敏感,所以仅供我自己了解。

【问题讨论】:

【参考方案1】:

NetTcpBinding 的默认客户端凭据类型是 Windows 身份验证。要使 Windows 身份验证正常工作,客户端和服务器必须位于同一域或相互信任的域(在您的情况下您没有)。

如果客户端和服务器都在同一个域中,WCF 将在“幕后”处理 Windows 身份验证机制。当客户端和服务器在同一台机器上时,它们实际上是在同一个域中,因此 Windows 可以使用自己的机制来处理加密和解密。不过,它只会在相互信任的域中执行此操作。

如果您没有相互信任的客户端和服务器域,则客户端和服务器必须有其他方法来确定它们是否使用自己的密钥相互信任。这就是证书的用武之地。客户端和服务器都有自己的证书(或者服务器可以向客户端颁发证书)。

运输安全就像对信封的外部和内部进行加密一样。不利的一面是,如果您必须将信封传递给您自己组织之外的人,他们需要一个解密密钥才能知道信封应该去哪里——现在他们也可以阅读信封中的消息。另一方面,传输安全性更快 - 它需要更少的安全开销数据与您的信封一起传递。

邮件安全会加密您的邮件,但邮政工作人员(互联网及其路由器)可以读取信封。只有源和目标拥有解密消息的密钥,但中介可以正确路由您的消息。

总结一下:要在 NetTcpBinding 上使用加密,客户端和服务器都必须在一个域(或相互信任的域)内,或者您必须拥有密钥交换证书。


编辑:有人要求我提供一些示例代码——这是 XAML 中的一个绑定元素。它通常放置在 netTcpBinding 元素中。

<binding name="Secure" listenBacklog="4000" receiveTimeout="00:20:00" sendTimeout="00:20:01" 
   maxReceivedMessageSize="2147483647" maxConnections="200" portSharingEnabled="true">
   <!-- ~2 GB -->
   <readerQuotas maxStringContentLength="2147483647"/>
   <!-- ~2 GB max string content length -->
   <security mode="Message">
      <transport clientCredentialType="None" protectionLevel="EncryptAndSign"/>
      <message clientCredentialType="None"/>
   </security>
</binding>

重要的部分是安全元素。为了运输安全,可以将模式属性更改为“运输”。 clientCredentialType 很可能不是“None”,而是“Certificate”、“Ntlm”或“Windows”,具体取决于上下文。

【讨论】:

我知道这是一篇旧帖子 - 但传输安全配置和消息安全配置的示例代码会有所帮助。我的知识在这里缺乏..我认为我可以通过简单地选择 TransportWithMessageCredential 在没有证书的情况下在 NetTcpBinding 上使用 UserName - 但由于某种原因,我正在阅读他们没有告诉你的内容,除非你有用户名密码验证这样的东西至少一个服务器证书。是这样吗? 你要么需要一个证书,要么服务器和客户端需要在相互信任的域中(通常这意味着它们必须在同一个域中,除非你准备好做一些复杂的事情)。 所以如果你设置 你是在明文发送?还是默认加密?感谢您的帖子。 安全模式“无”以明文形式发送,除非有其他东西(例如,IPSec 硬件)加密数据。 我不确定这个回复有多准确。例如,您可以为绑定定义传输安全模式,这意味着 SSL。该示例使用消息模式安全性,但定义了 元素,我认为这是多余的。

以上是关于WCF NetTcpBinding 安全性 - 它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

netTcpBinding 最快的安全配置是啥?

在 WCF-netTCPBinding 中测试 TLS 安全性

netTcpBinding 或 wsHttpBinding

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

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

带有 netTcpBinding 的 WCF 路由服务