1

我有一个使用 net.TCP 绑定的 WCF 服务,该服务可以在 LAN 内或通过 Internet 使用。

我已经阅读了 net.TCP 默认使用传输级安全性,但是这种安全性是点对点的,我认为如果我在 LAN 之外使用我的客户端,通过互联网和通信使用很多点,也许其中一些点不在没有安全性的情况下传输消息。它是否正确?

那么如果我也需要消息安全呢?我可以使用 ssl 证书 x509 来加密每条消息,并且只能由具有私钥的服务解密?

是否有一些文档解释了如何将证书与 net.TCP 绑定一起使用?我可以使用 open ssl 创建我的证书并将其与 WCF 一起使用吗?

谢谢。

4

1 回答 1

3

首先,这两种方法都是安全的,可以满足 90% 的情况。传输安全保护您的通信渠道,但不会加密您的实际消息。消息安全加密您的实际消息,因此消息通过的服务器无法看到消息内容,并且需要私钥来解密您的消息。所以有人可能会说消息安全更安全,至少它更适合互联网通信。关于 WCF 安全性的一些好的链接:WCF 中的消息安全以及模式和实践改进 Web 服务安全指南

netTcpBinding默认情况下使用传输安全性,但这并不意味着您不能使用消息安全性。传输安全性比消息安全性(每条消息都被加密)具有更少的计算开销,因此它具有更好的性能。通过 Internet使用的一个警告netTcpBinding是,它可能无法保证始终工作(尽管过去我已经通过 Internet 进行successfully设置netTcpBinding),因为它使用一些端口进行消息传输,这些端口并不总是保证由网络路由器和防火墙(通过 Internet,您的消息将通过许多路由器和防火墙。)对于 Internet 通信,请考虑 HTTP 绑定之一,例如basicHttpBindingwsHttpBinding支持消息安全的 或。

您可以像在其他绑定中一样使用消息安全性:

<netTcpBinding>
    <binding name="securedBinding">
      <security mode="Message">
      </security>
    </binding>
</netTcpBinding>

然后将bindingConfiguration端点上的 设置为securedBinding.

在托管您的服务的机器(服务器)上:

<behavoirs>
  <serviceBehavior>
    <behavior name="securityBehaviour">
      <serviceCredentials>
        <serviceCertificate
           findValue="serviceCert"
           storeLocation="LocalMachine"
           storeName="My"
           x509FindType="FindBySubjectName" />
      </serviceCredentials>
    </behavoir>
  </serviceBehavior>
</behavoirs>
<services>
  <service name="Service1"  behaviorConfiguration="securityBehaviour">
        <endpoint address="" binding="netTcpBinding" contract="IService1" bindingConfiguration="securedBinding">
        </endpoint>
  </service>
</services>

如果您有有限的客户并且您知道他们是谁,您可以使用自签名证书。但是,如果您希望在许多未知客户端使用您的服务时获得最佳安全性,您最好从已知 CA 购买一个。然后,您需要在服务器机器上安装服务器证书。 是一篇关于如何使用证书保护您的服务的文章,该博客还有一些您可能想阅读的其他有用的 WCF 安全文章。

于 2013-04-01T18:58:47.017 回答