使用X509Certificate2在https中进行客户端证书身份验证

时间:2012-10-23 15:07:02

标签: c# asp.net security authentication ssl

我试图了解客户端身份验证在https场景中的工作原理以及如何使用它来提供基本的身份验证/授权功能。

假设我想在证书和用户之间建立映射(例如IPrincipal)。我的服务器颁发证书并将其分发给客户端。当客户端连接时,我要求提供证书,如果提供了有效证书,我会根据之前定义的映射对用户进行身份验证。

我应该使用什么来创建映射?证书指纹是一个很好的候选人吗?是否足以确定客户身份?

或者我可能根本不需要映射,可以简单地接受我服务器发布的所有证书?

编辑:让我改一下 - 假设我可以发布客户端证书,如何在https会话期间验证客户端身份?

3 个答案:

答案 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

但是,一般来说,您可以使用证书中的任何唯一内容进行映射。