代码之家  ›  专栏  ›  技术社区  ›  Remotec

wcf nettcpbinding security-如何工作?

  •  25
  • Remotec  · 技术社区  · 15 年前

    我遇到了以下问题,试图通过设置在WCF的泥潭工作…

    我使用nettcp绑定创建了一个wcf客户机服务器服务。我没有对安全设置做任何更改,当在一台机器上运行时,它工作得非常好。但是,当我从另一台计算机运行我的客户机时,它抱怨服务器不喜欢发送的安全凭据。

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

    但我不明白的是:

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

    我的服务器上没有安装任何证书-我知道nettcp绑定需要某种形式的公钥来保护凭据-但当客户端和服务器都在同一台计算机上时,这似乎可以工作-数据是如何加密的?或者想要它,因为wcf知道它在同一台机器上,不需要加密?

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

    最后…传输和消息安全有什么区别?

    检查我的理解(请原谅这种情况!)消息安全性就像我从人A发了一封信给人B,然后我对我的手写体进行编码,以确保如果有人截取了它,他们就不能阅读它?运输安全是不是我决定用武装运输工具把我的信寄出去,这样在路上就没人能拿到?

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

    1 回复  |  直到 8 年前
        1
  •  32
  •   croxy StartPlayer    8 年前

    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”。

    推荐文章