WCF、安全和证书

Posted

技术标签:

【中文标题】WCF、安全和证书【英文标题】:WCF, Security and Certificates 【发布时间】:2010-10-21 11:50:24 【问题描述】:

我有一个客户端/服务器 WCF 应用程序,它需要对数据库进行某种用户身份验证。该应用程序(客户端和服务器一起)正在开发中,以出售给数十个客户,以在他们的 Intranet 上使用。我们不太担心加密通过网络传输的大部分数据,当然在身份验证期间除外。

考虑到 WCF 安全性,我不断回到我们应该使用 x509 证书的想法。但是,我们的客户肯定不想知道必须申请、购买和安装这些证书的任何细节。

我首先想知道在这种情况下实现用户名/密码身份验证的首选方法是什么。如果需要使用证书,客户必须向受信任的 CA 申请自己的证书,还是我们作为软件提供商可以生成证书供客户使用?

真的,我正在寻找一种最佳做法,对客户的摩擦最小。

谢谢!

编辑:我正在使用 NetTcpBinding,我的服务器作为 Windows 服务运行。

【问题讨论】:

【参考方案1】:

因此,我相信您知道,用户名/密码不需要客户端证书,它只需要托管 WCF 服务的服务器上的 HTTPS 证书 - 一旦您拥有该证书,您就可以愉快地使用标准的用户名/密码身份验证位(WCF 将不允许没有 HTTPS 的基于消息的身份验证)。

如果您想深入了解客户端证书根目录,您将获得不可否认性的优势——您可以确定发送的机器就是它所说的那个人(除非有人窃取了证书,这比用户名和密码组合正在走动)。作为软件提供商,您可以充当自己的证书颁发机构并生成自己的客户端证书(根据您的基础架构,有几种方法可以做到这一点),但是您需要将客户端配置为信任您的根 CA。

如果服务器和客户端在域环境中运行,您可以使用transport security with Windows authentication(您正在使用 tcp 绑定,所以互操作性无论如何都在窗外!)额外的好处是身份验证是透明的,您不需要在任何地方都不需要任何证书。如果您想验证服务器身份,那么message security with Windows authentication 就可以了。

【讨论】:

谢谢!我忘了提到的是我正在使用 NetTcpBinding。另外,请记住,服务器也被部署给多个客户,这是我关于证书问题的主要来源。【参考方案2】:

我有一个与您的场景类似的生产项目。我有一个通过 netTCPBinding 托管端点的 Windows 服务,并且我使用了 x509 证书……尽管在我的情况下,目的是加密传输层和消息层,因为我跨越了不受信任的安全边界。除了要求证书存在之外,我不太关心提供身份验证/授权。

与您的 Intranet 方案(我假设)类似,我在安装时对服务器和客户端计算机拥有权限......或者至少可以规定一些安装条款。

我没有购买 x509 证书并让客户承担这笔费用,而是选择推出自己的证书。我们将其中一台 Win2003 服务器设置为 CA,颁发我们自己的证书颁发机构证书。然后,我们为服务器生成了一个 x509 证书,并为客户端生成了单独的 x509 证书。

客户端和服务器证书已安装在客户端和服务器上(视情况而定)到计算机级别的个人用户存储中。我们还将 CA 证书直接安装到受信任的根证书颁发机构部分,从而使我们的客户端和服务器证书受信任。

因为我不太关心身份验证/授权,所以我不知道推荐什么作为处理将证书绑定到单个用户并且比机器级别更精细的最佳实践(我的解决方案是 windows 服务到 windows 服务通信——完全无人看管)。我认为您需要为每个用户提供一个证书,将其安装到证书 MMC 中的个人用户存储中。运行时实现将由您如何配置 WCF 来进行证书查找来指导,因此它应该相当容易。

在整个过程中,我非常依赖我从这篇很棒的 CodeProject 文章中学到的知识:Securing WCF Services with Certificates。它会引导您生成/安装证书。示例 WCF 应用程序是 IIS 托管的,但我能够非常轻松地将配置部分从 web.config 转换为 app.config。

在我的例子中,我将 Win2003 中用于请求证书的 Web 界面暴露给 Web 本身,因此客户端将来可以直接请求证书。我们有审批控制,所以它运作良好。我还没有需要生成新证书,所以我不能说这会带来多少摩擦。

【讨论】:

感谢您提供 CodeProject 链接。【参考方案3】:

如果您要跨越防火墙边界,那么证书将是您的最佳解决方案。我不太了解有关证书申请或您的申请的细节。不幸的是,据我所知,我认为您将不得不帮助他们申请证书,否则他们将不得不自己做,除非他们想在安装自己的证书服务器的过程中进行。如果应用程序将是内部应用程序,那么 Windows 身份验证将起作用并且非常简单,但如果您认为您的客户端将跨越防火墙边界使用您的应用程序,那么您不妨花时间使用证书,因为证书将在任何地方工作。现在有一种称为联合安全性的东西,您可以将身份验证权限委托给另一个实体。我认为如果说您必须使用域,并且您想将不在您域中的另一个域上的某人的权限委托给他们的域但它非常复杂并且我对其的理解非常有限,但您的要求的声音证书是要走的路。

安全性并不容易:)

【讨论】:

以上是关于WCF、安全和证书的主要内容,如果未能解决你的问题,请参考以下文章

使用证书的 WCF 传输安全性忽略链信任

wcf 服务服务器和客户端证书与 Ssl 证书不同时的安全异常

WCF 服务 - 具有用户名身份验证的证书和消息安全性

对于 WCF 服务,没有证书的 TransportWithMessageCredential 是不是足够安全?

WCF Rest 自托管证书安全服务返回 401 未经授权

“此服务的安全设置需要 Windows 身份验证”客户端证书 WCF 项目的 IIS 错误