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

时间:2010-03-29 08:11:00

标签: wcf security credentials binding nettcpbinding

我遇到了以下问题,试图解决WCF中设置的泥潭......

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

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

然而,我不明白的是:

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

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

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

最后......传输和邮件安全有什么区别?

要检查我的理解(请原谅!),如果我从A人发送了一封信给人B,我编写了我的手写信,以确保如果有人截获它,他们就无法读取它?如果我决定通过武装运输发送我的信件,以便沿途没有人可以接受我的信件,那么交通安全就是如此?

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

1 个答案:

答案 0 :(得分:32)

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>

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