C# 智能卡安全,您如何验证证书是否为假证书?

C# 智能卡安全,您如何验证证书是否为假证书?,c#,asp.net,ssl,cryptography,smartcard,C#,Asp.net,Ssl,Cryptography,Smartcard,我正在尝试开发一个ASP.net网站,该网站可以读取clientCertificate,以确保使用智能卡访问该网站(尝试取消用户名/密码登录) 我心目中的过程是: 用户注册一个帐户,C#记录用户的客户证书(公共) 然后,用户可以下次使用相同的clientCertificate登录,如果哈希有效,他们现在是经过身份验证的用户 我将使用下面的代码来确保证书的真实性。浏览器应该处理私钥,并确保证书没有伪造 基于Subject+certificate组合,C#为他们分配角色访问权限 以下代码可用于证书的

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

我心目中的过程是:

  • 用户注册一个帐户,C#记录用户的客户证书(公共)
  • 然后,用户可以下次使用相同的clientCertificate登录,如果哈希有效,他们现在是经过身份验证的用户
  • 我将使用下面的代码来确保证书的真实性。浏览器应该处理私钥,并确保证书没有伪造
  • 基于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???
    

    这就是智能卡身份验证过程的工作原理吗?

    先生,请看这个帖子。您不需要在代码中显式验证真实性。IIS会帮你做的


    IIS甚至尝试检查吊销列表(但是,如果CRL很大,这通常会被禁用)。在CRL非常大或检查延迟很高的情况下,应使用OCSP响应程序进行验证

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

    除非您需要将客户端证书与数据库帐户链接或执行附加验证步骤。但对于客户端证书身份验证,我仍然坚持使用IIS设置

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

    X509Certificate2 x509Cert2 = new X509Certificate2(Page.Request.ClientCertificate.Certificate);
    
    然后访问其属性,例如:

    x509Cert2.Subject
    

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

    客户端证书身份验证在SSL/TLS握手过程中完成

    它通常使用公钥基础结构来完成,服务器有一个(固定的)可信CA证书列表,用于验证客户端证书(与服务器的客户端验证证书的方式相同)。在此阶段之后,一旦证书提交给您的申请,您将知道:

    • 客户端拥有该证书的私钥(由TLS handhsake中的保证(SSL/TLS堆栈将为您验证这一点,无需实现任何东西)
    • 客户端具有证书中描述的标识,因为您将根据受信任的CA对其进行验证
    针对受信任CA的验证要求用户提前向该CA注册。如果证书不是由您信任的CA颁发的,则不能仅对其进行身份验证。(将证书的主题映射到本地用户ID是另一回事:如果需要,您可以在第一次连接时执行此操作:例如,让您自己的数据库或目录服务将主题DN映射到应用程序中的另一种用户ID。)

    用户注册帐户,C#记录用户的客户端证书 (公共)。用户可以在下次登录时使用相同的密码 clientCertificate,如果使用哈希,则它们现在是经过身份验证的用户 有效

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

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

    要做到这一点,就SSL/TLS握手而言,您需要让任何证书通过,然后验证证书本身。(您确实需要使用某种形式的验证。)这仍然保证客户机拥有其提供的公钥证书的私钥

    这需要两个步骤:

    • 您需要能够通过在
      证书请求
      TLS消息(TLS 1.1明确允许)中发送证书颁发机构的空列表来公布您将接受任何证书的事实
    • 将SSL/TLS堆栈配置为信任任何证书(同样,当您这样做时,不要忘记在应用程序中实现您自己的验证系统,否则任何东西都会通过)
    在.Net中,虽然应该可以使用a来解决第二点,但我从未找到改变第一点的方法(在中也有人问过)


    在Java中,JSSE的
    X509TrustManager
    允许您解决这两个问题。

    是的,我正在链接客户端证书(智能卡)使用具有更高权限的数据库帐户。我必须100%确定,智能卡实际上属于他们,而不仅仅是具有相同公钥的副本或假证书。好的,在这种情况下,使用Page.request.ClientCertificate.certificate获取请求证书对象(X509Certificate2)的属性,例如“x509Cert2.Subject”。但是,将验证部分留给IIS。如果客户端提供了一个错误的证书,您的asp.net代码甚至不会执行,因为IIS将拒绝它。那么我的代码是否正确?我只是检查哈希和证书是否有效(certificate.IsValid),并可能将其放入try{}catch{}这将足以确保此人拥有正确的智能卡?捕获将触发,我可能无法登录,因为代码无法获取证书(因为它是假的)。IIS确保提供的客户端证书有效(未过期、由受信任的机构颁发等)。一旦IIS说它很好,它就会将请求交给asp.net(您的代码)。此时,您有一个有效的证书,如果您希望对证书进行任何处理,可以使用上面的代码从请求中提取客户端证书。我认为,在配置了IIS的生产服务器中,“certificate.IsValid”是多余的(可能是无用的)