WCF 服务 - 具有用户名身份验证的证书和消息安全性
Posted
技术标签:
【中文标题】WCF 服务 - 具有用户名身份验证的证书和消息安全性【英文标题】:WCF Service - certificates and message security with UserName authentication 【发布时间】:2011-06-08 10:21:46 【问题描述】:我正准备创建一个 WCF 服务,我们的客户可以使用它来更新我们系统中的数据。所以它必须在互联网上可用。我有一本关于 WCF 的书,从中我知道 Message Security
是在 Internet 上提供 WCF 服务时要走的路。那是因为您不应该使用传输安全性,因为它只应该在可以保证服务和客户端之间存在点对点连接的环境中使用。我做对了吗?
所以我想将 Message Security 与自定义 UserName
身份验证结合使用。我知道我必须获得证书才能做到这一点。我们公司已经拥有用于我们网站的 SSL 证书。
和
Message Security 方式能否与需要 ASMX Web 服务的客户端互操作?出于测试目的,我使用 Makecert 创建了自己的证书。它工作正常,但我总是必须将证书添加到客户端计算机上的 Trusted Persons
。
Message Security
,而无需强制客户端手动将证书添加到Trusted Persons
?
现在,让我们假设以下场景:
在 ISA 服务器/防火墙后面有两个 Web 服务器。此 ISA 服务器持有 www.company.com 地址的证书。所以所有的 SSL 东西都由它处理。它还将传入的请求相应地转发到网络服务器。新创建的 WCF 服务应该在第二个网络服务器上运行。
是否必须将证书复制到网络服务器才能使用Message Security
?
如果是,我听说复制证书不是好的做法,因为它会降低安全级别。将证书移动到网络服务器不是一种选择,因为 Web-Server1 上的网站也需要它。
在这种情况下我有哪些选择?还有:
无论给定要求如何,这种情况下的最佳做法是什么?谢谢...
【问题讨论】:
在您提到您希望将消息安全与用户名身份验证一起使用的问题中,那么我不确定为什么消息安全需要复制证书?我错过了什么? 使用 MessageSecurity 时,您的消息可以被签名和/或加密。因此,您需要证书的私钥,而另一部分需要公钥。如果托管 WCF 服务的服务器没有私钥,他应该如何对消息进行签名或加密?或为此解密传入的消息。消息安全性仅包括安全上下文本身,因此您不必依赖传输功能。见msdn.microsoft.com/en-us/library/ms733137.aspx 【参考方案1】:精心准备的问题。首先我可能读了同一本书,我想澄清一下这个说法:
那是因为你不应该使用 运输安全,因为它应该 仅用于您所在的环境 可以保证有一个 之间的点对点连接 服务和客户。
是的。 HTTPS(传输安全)仅提供点对点安全,但 IMO 人员并不正确理解这种情况。您是否认为如果您通过 HTTPs 连接到您的网上银行,它会在互联网交换通信从 HTTPS 到 HTTP 的中间某个地方随机出现?不!点对点连接意味着客户端和提供请求 URL 的访问网关之间的安全传输通道。在您的方案中,这意味着客户端和您的 ISA 服务器之间的安全传输通道。您的 ISA 和 Web 服务器 2 之间的通信不会受到保护。如果您想要端到端的,它将在客户端和 Web 服务器 2 之间提供安全通道(ISA 将无法拦截消息),您需要消息安全性。
现在回答您的其他问题:
我可以使用相同的证书 WCF 服务的消息安全性?
是的,您可以,但您必须将私钥复制到您的 Web 服务器 2。
是消息安全方式 可与期望的客户互操作 ASMX Web 服务?
没有。纯 ASMX 客户端无法使用消息安全性,除非您编写大量自定义 SOAP 标头和扩展或安装 WSE 3.0。
是否可以启用消息 具有上述安全性 证书而不强制客户端 将证书添加到受信任的 人手?
是的,但发布证书的证书颁发机构必须在客户端计算机上受信任。 HTTPS 也一样。使用消息安全保护的服务还可以在 WSDL 中公开证书的指纹。客户端可以使用此指纹验证服务身份。我认为在这种情况下,您也不需要在客户端上安装证书,但是当证书过期时,所有客户端都必须更新。
我是否必须将证书复制到 网络服务器能够使用 消息安全?
是的,你必须。但这可能是个问题,因为出于安全原因,证书可能被标记为不可导出。最佳解决方案是为此目的申请新证书。
【讨论】:
感谢您的回答。 :-) 你有什么建议?切换到运输安全?如果是,我如何告诉服务部门,ISA 负责处理传输安全?因为如果我设置传输安全模式,该服务还需要“web-server2”上存在的证书,不是吗?我仍然可以使用 userNamePasswordValidationMode="Custom" 还是只能使用消息安全设置?这么多问题... ;) 是的,所有这些要求都是可能的。这只是您根据传输数据的要求和保密性做出的选择。 很好地澄清了对点对点安全含义的误解。我一直在阅读以了解开发 WCF 以在 php 中使用的最佳方法,并且担心通过 HTTPS 的basicHTTPBinding
不安全。
@LadislavMrnka:这不是我们想要消息安全的另一个原因,以便我们可以验证连接到服务的客户端吗?否则,如果我们只有 Transport,那么任何客户端都可能连接到该服务?我在这里错过了什么吗?此外,在问题 OP 中提到他们希望使用带有用户名身份验证的消息安全性,那么我不确定为什么消息安全性需要复制证书?我错过了什么?谢谢。
@BornToCode:大多数攻击来自内部网络,通常即使您有传输安全性,您的内部网络中也会有另一个传输安全通道,因此解密的内容将仅在面向公众的服务器和目标上.以上是关于WCF 服务 - 具有用户名身份验证的证书和消息安全性的主要内容,如果未能解决你的问题,请参考以下文章