没有证书和Windows身份验证的WCF消息安全性

Mar*_*tin 17 encryption wcf message certificate

我有一个WCF服务和客户端,它将部署到几家公司(数百家).一些公司将在他们的网络中运行该软件,一些公司将通过Internet运行它(办公室的WCF服务器,另一个的WCF客户端).

我们想要加密WCF服务器和客户端之间的通信.我们没有必要使用WCF安全性来验证客户端/订户,因为我们有自己的用户名/密码登录,客户端将使用这些登录服务器来登录服务器.

  • 我们不能依赖Windows身份验证,因为某些用户将通过Internet运行它,并且WCF服务器可能与WCF客户端不在同一个域中.
  • 如果我们使用"真实"证书*,运行该软件的公司必须从CA购买证书并安装它,然后配置我们的软件才能使用它,但这对于大多数人来说太复杂了.
  • 我们可以在安装WCF服务器期间自动创建证书,但之后我们必须自动将其安装到证书存储中,并以某种方式自动授予IIS权限以读取证书.这比我们想要的更复杂.

简而言之,我们想要一个简单的解决方案,其中加密仅基于共享密钥,在我们的例子中是用户登录的用户名/密码.我知道这不会提供最好的加密,但我们愿意交换一些安全性,以使软件更容易部署.

这可能吗?

*使用"真实"证书,我指的是从证书颁发机构购买的证书,而不是我自己创建/自签名的证书.

mar*_*c_s 17

如果你想加密传输上的消息(这是一个非常好的主意!),发送者(客户端)和服务器之间必须有一些共享知识.这可以是硬编码的,但这根本不是一个好主意 - 如果这种"共同共享"知识遭到破坏,攻击者就可以破译并阅读您的所有消息.

此外,由于绝对推荐练习,因此在WCF中不支持任何类型以简化共享密钥.你是自己的 - 你必须自己完成100%的方式.

以安全的方式交换公共共享密钥的唯一可行方法是使用证书.没办法,抱歉.证书甚至不必用于用户身份验证或任何东西 - 但它在呼叫者和服务之间建立共享秘密,从而允许呼叫者以这样的方式加密消息,只有预期的接收者才能实际解密和使用他们.

所以我真的没有看到任何方法可以绕过你的服务器上的证书 - 不需要在每个客户端上,而是在你的服务运行的每个服务器上.

PS:如果你真的想调查"硬编码共享秘密"方法,你需要考虑这个问题:

  • 如何在每个客户端安全地存储共享密钥?
  • 如何使用存储的共享密钥中的信息来加密邮件?

通常,这种方法有两方面:

  1. 交换某种形式的私钥/公钥对; 服务器生成密钥对并将私钥保留给自身并与客户端共享公钥(例如,通过WCF消息)
  2. 使用该私钥/公钥对,交换公共共享密钥,例如对称加密消息的"加密密钥"(由于它是对称的,服务器可以使用相同的密钥来解密消息)
  3. 客户端上的安装基础结构(例如,称为行为的WCF扩展)在消息出来之前检查消息并使用您的共享密钥对其进行加密

总而言之,这真的不是微不足道的 - 任何简单的东西都不值得被称为"安全".

如果你看看你将要做的所有工作 - 使用WCF内置证书机制会不会更容易?

体面安全称职很难-那么,为什么不充分利用什么可用的,而不是自己做所有的工作,或者更糟:想出一个半生不熟的解决方案,是很容易破解,你可以很容易地以明文发送的一切...... ..不要低估处理即使是最基本的安全方案所需的代码的复杂性和数量 - WCF为您完成所有这些 - 免费且可靠且安全地使用它 - 使用它!你不会后悔的!

  • 如果你想要加密(并且你做**!),那么你需要一个共享秘密 - 一个硬编码(不推荐)到你的客户端的配置或其他东西,或者当前可用的另一个选项是证书. (2认同)

Phi*_*ppe 3

好吧,使用 WCF,您可以在消息级别使用密码凭据,在传输级别使用 SSL,我认为这对于您的情况就足够了。

这里

  • 传输级别的 SSL 不需要安装证书吗?那么,它真的不符合我列出的要求吗?您链接到的页面显示密码凭据在消息级别不可用;只是用户名。密码用于传输凭证。此外,在“消息客户端凭据类型”下,您所指的页面显示“请注意,WCF 不允许使用用户名进行任何加密操作,例如生成签名或加密数据。”。你能解释一下你的意思吗? (2认同)