我有一个客户端/服务器WCF应用程序,需要对数据库进行某种用户身份验证。该应用程序(客户端和服务器一起)正在开发出售给数十个客户,以便在其内部网上使用。我们并不太担心加密大部分移动数据,当然除了在身份验证过程中。
考虑到WCF安全性,我不断回到我们应该使用x509证书的想法。但是,我们的客户绝对不想知道必须申请,购买和安装这些证书的任何细节。
首先,我想知道在这种情况下实现用户名/密码身份验证的首选方法是什么。如果需要使用证书,客户是否必须从受信任的CA申请自己的证书,或者我们作为软件提供商是否可以生成证书供客户使用?
我真的在寻找最佳实践,对客户的摩擦最小。
谢谢!
编辑:我正在使用NetTcpBinding,而我的服务器正在作为Windows服务运行。
答案 0 :(得分:5)
因此,用户名/密码不需要客户端证书,因为我确信您知道,它只需要在托管WCF服务的服务器上使用HTTPS证书 - 一旦您拥有,您就可以愉快地使用标准用户名/密码身份验证比特(如果没有HTTPS,WCF将不允许基于消息的身份验证)。
如果您想要关闭客户端证书根目录,那么您将获得不可否认性的优势 - 您可以确定机器发送的是它所说的人(除非有人窃取了证书,这不太可能是用户名和密码组合去散步)。您作为软件提供商可以充当您自己的证书颁发机构并生成您自己的客户端证书(根据您的基础架构,有几种方法可以执行此操作),但您需要将客户端配置为信任您的根CA.
如果服务器和客户端在域环境中运行,您可以使用transport security with Windows authentication(您正在使用tcp绑定,因此无论如何互操作性都在窗外!)额外的好处是身份验证是透明的,你不需要任何证书。如果您想要验证服务器身份,那么message security with Windows authentication就可以了。
答案 1 :(得分: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本身,因此客户端可以在将来直接请求证书。我们有批准控制,所以效果很好。我还没有必要生成新的证书,所以我不能说会产生多大的摩擦。
答案 2 :(得分:1)
如果您要跨越防火墙边界,那么证书将成为您的最佳解决方案。我对证书或您的应用程序的应用程序的细节知之甚少。不幸的是,据我所知,我认为你必须帮助他们申请证书,否则他们必须自己做,除非他们想在安装自己的证书服务器的过程中进行。如果应用程序将是内部的,那么Windows身份验证将起作用并且非常简单但如果您认为您将拥有跨越防火墙边界的应用程序用户,那么您也可以投入时间使用证书,因为证书可以在任何地方使用。现在有一种称为联合安全性的东西,您可以将身份验证的权限委派给另一个实体。我认为,如果你说你有域名,并且你想要将不属于你域名的其他域名的某人的权限委托给他们的域名,但是它非常复杂,而且我对它的理解非常有限,但是你的要求听起来很有用证书是要走的路。
安全不容易:)