C# 智能卡安全,您如何验证证书是否为假证书?
我正在尝试开发一个ASP.net网站,该网站可以读取clientCertificate,以确保使用智能卡访问该网站(尝试取消用户名/密码登录) 我心目中的过程是:C# 智能卡安全,您如何验证证书是否为假证书?,c#,asp.net,ssl,cryptography,smartcard,C#,Asp.net,Ssl,Cryptography,Smartcard,我正在尝试开发一个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对其进行验证
- 您需要能够通过在
TLS消息(TLS 1.1明确允许)中发送证书颁发机构的空列表来公布您将接受任何证书的事实证书请求
- 将SSL/TLS堆栈配置为信任任何证书(同样,当您这样做时,不要忘记在应用程序中实现您自己的验证系统,否则任何东西都会通过)
在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”是多余的(可能是无用的)