2012-10-23 179 views
1

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

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

我应该使用什么来创建映射? cert thumbprint是不错的人选?足以确定客户身份吗?

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

编辑:让我重新修改它 - 假设我可以颁发客户端证书,在https会话期间如何验证客户端身份?

回答

1

很多你的要求很大程度上取决于你现有的证书基础设施的外观。 出于安全原因,我会强烈建议通过映射来识别特定用户。如果您已经尽力为用户身份验证分发证书,那么可能值得保证。您需要的任何授权或审计应该是每个用户。 最好的方法是使用cert CN(通用名称)。拇指指纹将被识别为特定的证书,但是当证书到期时会发生什么? 这当然意味着当您颁发证书时CN受到控制,并且将与特定人员相关。我发现使用电子邮件地址非常可靠,因为您可以通过发送确认电子邮件来创建验证例程。您还可以通过电子邮件地址强制执行一些唯一性。

最难的部分是分发证书并让IIS向客户端请求证书,以便您的asp.net应用程序可以访问其信息。一旦你有所有的请求将在Request.ClientCertificate有什么东西,其中有他们的证书的所有细节,你需要认证他们。

0

我假设你使用.Net框架。您可以尝试使用HttpRequest.ClientCertificate属性。证书验证已经用ASP.NET完成,您只需检查IsValid属性即可。其余的验证是地图证书给用户。

如果所有证书都由相同的CA颁发,则可以使用证书序列号。如果不包含具有序列号的HttpClientCertificate.Issuer属性。

如果您需要一些调试,指纹很难再使用。

0

您的问题包含两个不同的部分:

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。 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

然而,一般来说,你可以使用任何独特的东西在证书映射。

相关问题