2012-04-20 31 views
3

我想開發一個ASP.net網站讀取則ClientCertificate,以確保智能卡來訪問網站(試圖用用戶名/密碼登錄做掉)。智能卡安全性,您如何認證證書不是假的?

的過程中,我在我的腦海是:

  1. 用戶註冊一個賬號和C#記錄用戶的clientCertificate(公共)。然後
  2. 用戶可以登錄與同一clientCertificate接下來的時間,而他們現在的身份驗證的用戶,如果哈希有效。
  3. 我將使用下面的代碼,以確保證書的真實性。瀏覽器應該處理私鑰並確保證書不被僞造。
  4. 基於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??? 

這是認證過程中應如何智能卡工作???

回答

2

如果你只是需要驗證你應該在IIS做這個客戶端證書的用戶。除非你需要客戶端證書與數據庫帳戶鏈接或執行額外的驗證步驟

Specify Whether to Use Client Certificates (IIS 7)

:你並不需要在所有添加任何代碼到你的應用程序。但仍然爲客戶端證書身份驗證,我會堅持使用IIS設置。

更新: 如果你需要操作的客戶端證書,你可以這樣做:

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

,然後訪問它的屬性,如:

x509Cert2.Subject 

然而,離開了驗證件直到IIS。如果客戶提出了一個壞的證書您的asp.net的代碼,因爲IIS甚至不會執行會拒絕它

+0

是的,我將客戶端證書(智能卡)與具有更高特權的數據庫帳戶連接起來。我必須100%確定,智能卡實際上屬於他們,而不僅僅是具有相同公鑰的複製或僞造證書。 – Dexter 2012-04-20 15:41:03

+0

好的,在這種情況下,使用Page.Request.ClientCertificate.Certificate獲取請求證書對象(X509Certificate2)的屬性,例如「x509Cert2.Subject」。但是,將驗證片留給IIS。如果客戶端提交了一個錯誤的證書,你的asp.net代碼甚至不會執行,因爲IIS會拒絕它。 – Ulises 2012-04-20 15:45:19

+0

那麼我的代碼是正確的呢?我只是檢查散列和證書是否有效(certificate.IsValid),並且可能將其放在try {} catch {}中,這足以確保該人擁有正確的智能卡?捕獲將觸發,我可以通過登錄失敗,因爲代碼無法獲取證書(因爲它是假的)。 – Dexter 2012-04-20 15:50:36

2

看到這個線程,先生。您不需要在代碼中明確驗證真實性。 IIS會爲你做。

Does IIS do the SSL certificate check or do I have to verify it?

IIS甚至試圖檢查吊銷列表(但是,如果CRL大,這是經常被禁用)。如果CRL非常大或者檢查延遲很高,應使用OCSP應答器進行驗證http://www.axway.com/products-solutions/email-identity-security/identity-security/va-suite

+0

所以在C#代碼,當我搶Request.ClientCertificate.Certificate和Request.ClientCertificate.Subject - 這是保證這個人不只是使人的智能卡證書的副本,並複製公鑰? (換句話說,IIS將確保Request.ClientCertificate.Certificate每次都是唯一且真實的)? – Dexter 2012-04-20 15:43:48

+0

IIS將幫助您確保提供的證書有效。順便說一下,公鑰是公開的。每個人都可以擁有它:http://en.wikipedia。org/wiki/Secure_Socket_Layer – Ulises 2012-04-20 16:00:13

+0

是的,當然,這是我的觀點。如果我在代碼中檢查公鑰,以此來確定該用戶是否真正是在我的代碼和數據庫中註冊的用戶 - 那麼這是一個安全漏洞,因爲公共密鑰是公開給所有人的。我想知道我是否需要privatekey-publickey-combo檢查來確保真實性。 – Dexter 2012-04-20 16:14:09

1

客戶端證書認證的SSL/TLS握手期間完成。

它通常使用公鑰基礎結構完成,服務器擁有一個(固定的)可信CA證書列表,用於驗證客戶端證書(與客戶端驗證服務器的方式相同)。一旦證書也到這個階段之後你的應用程序,你會知道:

  • 客戶擁有該證書的私鑰(由TLS handhsake的Certificate Verify message(在SSL保證/ TLS協議棧會驗證這一點對你來說,沒有必要實施任何東西);
  • 的客戶端證書中描述的身份,因爲你已經驗證這對你的信任的CA

對信任的CA驗證需要用戶請提前向該CA註冊。如果我不能驗證任何證書, t並未由您信任的CA頒發。 (將證書的主題映射到本地用戶標識是另一回事:例如,如果需要,可以在第一次連接時執行此操作:例如,使用自己的數據庫或目錄服務將主題DN映射到應用程序中的另一種用戶標識。

用戶註冊一個帳戶,C#記錄用戶的客戶端證書 (公共)。然後,用戶可以使用相同的 clientCertificate登錄,如果hash 有效,則它們現在是經過身份驗證的用戶。

這聽起來像你想允許任何證書將呈現和使用它的初始登記,而不必訴諸普遍信任的CA.

原則上這是可能的,我已經完成了這項工作來探索Java中PKI的替代方案。

要做到這一點,您需要讓任何證書通過SSL/TLS握手,稍後再驗證證書。 (您需要使用某種形式的驗證。)您仍然保證,客戶端擁有它提供的公鑰證書的私鑰。

這樣做需要兩個步驟:

  • 您需要能夠來宣傳你會接受任何證書事實上,在Certificate Request TLS消息發送證書頒發機構的空單(明確由TLS 1.1允許)。
  • 配置SSL/TLS堆棧信任任何證書(再次,當你做到這一點,不要忘了你的應用程序中實現自己的驗證系統,否則很少會真正得到通過)。

在.NET中,而應該儘可能使用remote certificate validation callback解決第二點,我從來沒有找到一種方法來改變第一點(這也被要求在this question)。

在Java中,JSSE的X509TrustManager允許您解決這兩個問題。

+0

不,我只允許擁有我正在尋找的智能卡類型的用戶訪問系統。我想我必須聯繫證書頒發機構,申請一個服務器證書,然後「完成」證書請求,然後將其插入系統,然後才能開始允許客戶端向服務器數據庫註冊他們的Clientcertificates。我猜我必須使用try/catch來檢查用戶是否輸入了有效的證書,否則當他們有一個無效的私鑰時會彈出一個錯誤。 – Dexter 2012-04-20 17:30:17

+0

擁有相同類型的智能卡並不意味着您的所有用戶都擁有來自同一CA的證書。 (例如,如果它們是由您的環境中的CA提供的)。您的服務器證書不一定來自您將接受客戶端證書的CA之一(它是相當獨立的)。您甚至不需要嘗試/捕獲:如果用戶提供了您未配置的CA識別的證書,則甚至不會建立SSL/TLS連接(因此不會建立HTTP(S)連接)。從UI的角度來看,它在瀏覽器中看起來像是'ssl_error_blablabla'。 – Bruno 2012-04-20 17:46:20

+0

現在我正在我的開發環境中使用自簽名服務器證書進行測試,並且只是讀取客戶端證書(不管我沒有檢查任何CA),所以它總是說SSL錯誤,但它允許您進入網站。當我將其轉換爲X509Certificate2時,如果您更改證書的字節並嘗試計算散列,則會拋出CryptographyException。所以這個例外可以讓你知道這個證書是否有什麼腥意。這是您的服務器端代碼可以確保真實性的一種方式(否則您需要驗證客戶端證書撤銷和一些IIS設置 – Dexter 2012-04-20 18:59:10