3

我正在尝试开发一个读取 clientCertificate 的 ASP.net 站点,以确保使用智能卡访问该网站(试图取消用户名/密码登录)。

我脑海中的流程是:

  1. 用户注册一个账户,C#记录用户的clientCertificate(public)。
  2. 然后,用户下次可以使用相同的 clientCertificate 登录,如果哈希有效,他们现在是经过身份验证的用户。
  3. 我将使用下面的代码来确保证书的真实性。浏览器应该处理私钥并确保证书不是伪造的。
  4. 基于 Subject+certificate 的组合,C# 为他们分配了他们的角色访问权限。

以下代码可以用于证书的真实性吗?

X509Certificate x509Cert = new X509Certificate(Request.ClientCertificate.Certificate);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] hashvalue = sha.ComputeHash(Request.ClientCertificate.Certificate);
byte[] x509Hash = x509Cert.GetCertHash();
// compare x509Hash WITH hashvalue to ensure they are a match. 
// If not, possibly faked certificate, not a real smartcard???

这是智能卡身份验证过程应该如何工作???

4

3 回答 3

2

看到这个帖子,先生。您无需在代码中明确验证真实性。IIS 将为您完成。

IIS 是否进行 SSL 证书检查,还是我必须对其进行验证?

IIS 甚至会尝试检查吊销列表(但是,如果 CRL 很大,这通常会被禁用)。在 CRL 非常大或检查延迟很高的情况下,应使用 OCSP 响应程序进行验证http://www.axway.com/products-solutions/email-identity-security/identity-security/va-suite .

于 2012-04-20T15:33:48.453 回答
2

如果您只需要使用客户端证书对用户进行身份验证,您应该在 IIS 中执行此操作。您根本不需要向您的应用程序添加任何代码:

指定是否使用客户端证书 (IIS 7)

除非您需要将客户端证书与数据库帐户相关联或执行额外的验证步骤。但是对于客户端证书身份验证,我仍然会坚持使用 IIS 设置。

更新:如果您需要操作客户端证书,您可以执行以下操作:

X509Certificate2 x509Cert2 = new X509Certificate2(Page.Request.ClientCertificate.Certificate);

然后访问其属性,例如:

x509Cert2.Subject

但是,将验证部分留给 IIS。如果客户端提供了错误的证书,您的 asp.net 代码甚至不会执行,因为 IIS 会拒绝它

于 2012-04-20T15:38:38.980 回答
1

客户端证书身份验证在 SSL/TLS 握手期间完成。

它通常使用公钥基础设施来完成,服务器有一个(固定的)受信任的 CA 证书列表,用于验证客户端证书(与服务器的客户端相同)。在此阶段之后将证书提交给您的应用程序后,您将知道:

  • 客户端拥有该证书的私钥(由 TLS 握手中的Certificate Verify消息保证(SSL/TLS 堆栈将为您验证这一点,无需实现任何东西);
  • 客户端具有证书中描述的身份,因为您将根据受信任的 CA 对其进行验证。

针对可信 CA 的验证要求用户提前向该 CA 注册。如果证书不是由您信任的 CA 颁发的,则您不能只对任何证书进行身份验证。(将证书的主题映射到本地用户 ID 是另一回事:如果需要,您可以在第一次连接时执行此操作:例如,拥有自己的数据库或目录服务以将主题 DN 映射到应用程序中的另一种用户 ID。)

用户注册一个账户,C#记录用户的clientCertificate(public)。然后,用户下次可以使用相同的 clientCertificate 登录,如果哈希有效,他们现在是经过身份验证的用户。

听起来您希望允许提供任何证书并将其用于初始注册,而不必求助于通常受信任的 CA。

原则上这是可能的,我这样做是为了探索 Java 中 PKI 的替代方案。

为此,就 SSL/TLS 握手而言,您需要让任何证书通过,并稍后验证证书本身。(您确实需要使用某种形式的验证。)您仍然可以保证客户端拥有它提供的公钥证书的私钥。

这样做需要两个步骤:

  • 您需要能够通过在Certificate RequestTLS 消息中发送一个空的证书颁发机构列表(TLS 1.1 明确允许)来宣传您将接受任何证书的事实。
  • 配置 SSL/TLS 堆栈以信任任何证书(同样,当您这样做时,不要忘记在您的应用程序中实现您自己的验证系统,否则任何事情都会真正通过)。

在 .Net 中,虽然应该可以使用远程证书验证回调来解决第二点,但我从来没有找到改变第一点的方法(这个问题中也有人问过)。

在 Java 中,JSSEX509TrustManager允许您解决这两个问题。

于 2012-04-20T16:30:28.600 回答