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

没有证书和windows身份验证的WCF消息安全性,wcf,encryption,certificate,message,Wcf,Encryption,Certificate,Message,我有一个WCF服务和客户端,它将被部署到数家公司(数百家)。有些公司将在其网络中运行该软件,有些公司将在互联网上运行(WCF服务器在办公室,WCF客户端在另一个办公室) 我们想要加密WCF服务器和客户端之间的通信。我们不需要使用WCF安全性对cient/订户进行身份验证,因为我们有自己的用户名/密码日志,客户端将使用该日志登录服务器 我们不能依赖Windows auth,因为一些用户将在Internet上运行它,并且WCF服务器可能与WCF客户端不在同一个域中 如果我们使用“真正的”证书*,运

我有一个WCF服务和客户端,它将被部署到数家公司(数百家)。有些公司将在其网络中运行该软件,有些公司将在互联网上运行(WCF服务器在办公室,WCF客户端在另一个办公室)

我们想要加密WCF服务器和客户端之间的通信。我们不需要使用WCF安全性对cient/订户进行身份验证,因为我们有自己的用户名/密码日志,客户端将使用该日志登录服务器

  • 我们不能依赖Windows auth,因为一些用户将在Internet上运行它,并且WCF服务器可能与WCF客户端不在同一个域中
  • 如果我们使用“真正的”证书*,运行该软件的公司将不得不从CA购买证书并安装它,然后配置我们的软件以使用它,但这对大多数公司来说太复杂了
  • 我们可以在安装WCF服务器的过程中自动创建证书,但随后我们必须将其自动安装到证书存储中,并以某种方式自动授予IIS读取证书的权限。这比我们想象的要复杂得多
简言之,我们需要一个简单的解决方案,其中加密仅基于共享秘密,在我们的示例中,用户登录时使用的用户名/密码。我知道这不会提供最好的加密,但我们愿意牺牲一些安全性,使软件更易于部署

这可能吗


*对于“真实”证书,我指的是从证书颁发机构购买的证书,而不是我自己创建/自签名的证书。

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


请参阅。

如果要加密传输上的消息(这是一个非常好的主意!),发送方(客户端)和服务器之间必须有一些共享的知识。这可以是硬编码的,但这真的不是一个好主意-如果“公共共享”知识被泄露,攻击者可以破译并读取您的所有消息

另外,由于这肯定是而不是推荐的做法,因此WCF中没有任何形式的支持来简化共享秘密的使用。你是靠自己的——你必须100%靠自己

以安全方式交换公共共享秘密的唯一可行方法是使用证书。没办法,对不起。证书甚至不必用于用户身份验证或其他任何用途,但它在调用者和服务之间建立了一个共享秘密,从而允许调用者以只有预期接收者才能实际解密和使用的方式对消息进行加密

所以我真的看不出有什么办法可以在服务器上获得证书——不需要在每台客户机上,而是在运行服务的每台服务器上

马克

PS:如果你真的想调查“硬编码共享秘密”方法,你需要考虑以下几点:

  • 你如何在你的每个客户身上安全地存储一个共享的秘密
  • 您如何使用存储的共享机密中的信息来加密您的邮件
通常,方法有两个方面:

  • 交换某种形式的私钥/公钥对;服务器生成一个密钥对,并将私钥保存在自身,并与客户端共享公钥(例如,通过WCF消息)
  • 使用该私钥/公钥对,交换一个公共共享密钥,例如对称加密消息的“加密密钥”(由于它是对称的,服务器可以使用相同的密钥解密消息)
  • 在客户端上设置基础结构(例如,称为行为的WCF扩展),以便在消息传出之前检查消息,并使用共享密钥对其进行加密
  • 总而言之,这真的不是小事——任何比这更简单的东西都不值得称为“安全性”

    如果你看看所有这些工作,你将不得不做-它不是更容易使用WCF内置的证书机制


    值得称道的安全性是很难做到的-所以为什么不利用现有的资源,而不是自己做所有的工作,或者更糟的是:想出一个半生不熟的解决方案,它很容易破解,你也可以轻松地以明文发送所有内容。。。。。不要低估处理最基本的安全场景所需的代码的复杂性和数量-WCF为您提供所有这些-免费、可靠、安全-使用它!你不会后悔的

    对于消息安全性,客户端提供一些凭据,服务器提供一些凭据。对于此设置和您的场景,您不能使用客户端用户名和密码以及服务器证书来提供服务器凭据。这为您提供了实现此目标所需的配置设置的合理配置,但aspNet成员资格部分除外,您必须将其替换为自定义验证配置


    您仍然需要在服务器上使用有效的证书(客户端上不需要证书),但我看不到任何解决方法

    看看下面的示例:


    它使用证书,但没有证书存储-因此无需安装。

    Hmm。。也许可以用一些简单的方法。将加密从软件移动到硬件。从每个客户端网络到您自己的VPN,然后您可以为WCF传输做任何您喜欢的事情。这行文字不清楚,问题解决了

    当然,这说起来容易做起来难,但是大多数网络供应商都提供了一个非常简单的VPN配置,这可能比尝试开发SSL证书安装程序和配置客户端要容易

    我希望有帮助

    威尔