我想開發一個ASP.net網站讀取則ClientCertificate,以確保智能卡來訪問網站(試圖用用戶名/密碼登錄做掉)。智能卡安全性,您如何認證證書不是假的?
的過程中,我在我的腦海是:
- 用戶註冊一個賬號和C#記錄用戶的clientCertificate(公共)。然後
- 用戶可以登錄與同一clientCertificate接下來的時間,而他們現在的身份驗證的用戶,如果哈希有效。
- 我將使用下面的代碼,以確保證書的真實性。瀏覽器應該處理私鑰並確保證書不被僞造。
- 基於Subject +證書組合,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???
這是認證過程中應如何智能卡工作???
是的,我將客戶端證書(智能卡)與具有更高特權的數據庫帳戶連接起來。我必須100%確定,智能卡實際上屬於他們,而不僅僅是具有相同公鑰的複製或僞造證書。 – Dexter 2012-04-20 15:41:03
好的,在這種情況下,使用Page.Request.ClientCertificate.Certificate獲取請求證書對象(X509Certificate2)的屬性,例如「x509Cert2.Subject」。但是,將驗證片留給IIS。如果客戶端提交了一個錯誤的證書,你的asp.net代碼甚至不會執行,因爲IIS會拒絕它。 – Ulises 2012-04-20 15:45:19
那麼我的代碼是正確的呢?我只是檢查散列和證書是否有效(certificate.IsValid),並且可能將其放在try {} catch {}中,這足以確保該人擁有正確的智能卡?捕獲將觸發,我可以通過登錄失敗,因爲代碼無法獲取證書(因爲它是假的)。 – Dexter 2012-04-20 15:50:36