6

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

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

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

真的,我正在寻找一种最佳实践,对我们的客户的摩擦最小。

谢谢!

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

4

3 回答 3

5

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

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

如果服务器和客户端在域环境中运行,您可以将传输安全性与 Windows 身份验证一起使用(您正在使用 tcp 绑定,因此互操作性无论如何都在窗外!)额外的好处是身份验证是透明的,而您不需要在任何地方都不需要任何证书。如果您想要验证服务器身份,那么使用 Windows 身份验证的消息安全性就可以解决问题。

于 2009-04-23T22:37:58.823 回答
2

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

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

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

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

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

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

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

于 2009-05-19T20:12:12.717 回答
1

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

安全性不应该是容易的:)

于 2009-04-23T22:44:09.840 回答