我试图了解客户端身份验证在https场景中的工作原理以及如何使用它来提供基本的身份验证/授权功能。
假设我想在证书和用户之间建立映射(例如IPrincipal)。我的服务器颁发证书并将其分发给客户端。当客户端连接时,我要求提供证书,如果提供了有效证书,我会根据之前定义的映射对用户进行身份验证。
我应该使用什么来创建映射?证书指纹是一个很好的候选人吗?是否足以确定客户身份?
或者我可能根本不需要映射,可以简单地接受我服务器发布的所有证书?
编辑:让我改一下 - 假设我可以发布客户端证书,如何在https会话期间验证客户端身份?
答案 0 :(得分:1)
您的要求很大程度上取决于您现有的证书基础架构的外观。 出于安全考虑,我强烈建议通过映射识别特定用户。如果您已经为用户身份验证分发证书,那么可能还有一些值得保护的东西。您需要的任何授权或审核都应该是每个用户。 最好的方法是使用cert CN(通用名称)。指纹将标识为特定证书,但证书到期时会发生什么? 这当然意味着当您颁发证书时,CN将受到控制,并且将与特定人员相关。我发现使用电子邮件地址非常可靠,因为您可以通过发送确认电子邮件来创建验证例程。您还可以使用电子邮件地址强制执行某些唯一性。
困难的部分是分发证书并让IIS向客户询问证书,以便您的asp.net应用程序可以访问其信息。一旦您拥有所有请求,Request.ClientCertificate
中包含其证书的所有详细信息,您就需要对其进行身份验证。
答案 1 :(得分:0)
我假设你正在使用.Net框架。您可以尝试使用HttpRequest.ClientCertificate属性。已经使用ASP.NET完成证书验证,您只需要检查IsValid属性。其余验证是用户的地图证书。
如果所有证书都由同一CA颁发,则可以使用证书序列号。如果不包含带序列号的HttpClientCertificate.Issuer属性。
如果您需要一些调试,Thumbprint很难在以后使用。
答案 2 :(得分:0)
您的问题包含2个不同的部分:
1)如何验证客户证书是否由我发出且信誉良好?
非常一般的答案是您根据受信任的根证书验证它的链。 例如,你可以在这里阅读:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd407310(v=vs.85).aspx http://www.openssl.org/docs/apps/verify.html http://www.cryptosys.net/pki/x509_validatechain.html
在大多数情况下,您不必编写任何代码来执行此操作。您只需要在Web服务器之前安装(例如)Apache。 Apache可以配置为根据可信证书请求和验证客户端证书。
2)如何将证书映射到用户?
如果您正在寻找一种常用方法,那么您应该使用证书中的主题备用名称属性来存储主体名称。这是多个提供商使用的最常用方式。
以下是几个与Windows相关的有趣链接:
http://technet.microsoft.com/en-us/library/cc736706(v=ws.10).aspx
http://technet.microsoft.com/en-us/library/cc736781(WS.10).aspx
但是,一般来说,您可以使用证书中的任何唯一内容进行映射。