2013-03-05 77 views
2

我想通過Sun的MSCAPIProvider從Windows上的Java胖客戶端的智能卡(PKI)獲取用戶身份。我們的目標是:如何使用Java從Windows上的智能卡(MSCAPI)獲取用戶身份?

  1. 用戶打開應用程序
  2. 提示卡
  3. 提示輸入PIN
  4. 我得到的X509Certicate在Java中
  5. 授予訪問權限,等等

我已找到基於this stackoverflow問題示例哪些列表的所有證書在我的商店,我可以簽署一些字節與Microsoft智能卡提供商PIN提示。

這是我的代碼:

Provider provider = Security.getProvider("SunMSCAPI"); 
KeyStore store = KeyStore.getInstance("Windows-MY", provider); 
store.load(null, null); 

System.out.println(store); 
Enumeration<?> aliases = store.aliases(); 
while(aliases.hasMoreElements()) { 
    String alias = aliases.nextElement().toString(); 
    Certificate[] signerKey = (Certificate[]) store.getCertificateChain(alias); 
    Object entry = store.getKey(alias, null); 
    System.out.println(alias + " " + Arrays.toString(signerKey)); 
    System.out.println(entry); 
} 

Signature sig = Signature.getInstance("SHA1withRSA",provider); 
PrivateKey key = (PrivateKey) store.getKey("Michael-O", null); 

sig.initSign(key); 
sig.update("Test".getBytes()); 
System.out.println(Arrays.toString(sig.sign())); 

現在我面臨兩個問題:

  1. 我不知道他的別名可能是什麼(雞蛋的問題)
  2. 怎麼辦我強制使用X509Cert進行PIN授權,並通過HTTPS建立SSL上下文?

哪些是缺失的位?

+0

您是否試圖通過請求存儲中的所有密鑰來過濾掉別名?您是否嘗試添加[CallbackHandler](http://docs.oracle.com/javase/7/docs/api/javax/security/auth/callback/CallbackHandler.html)? – 2013-03-06 00:29:16

+0

1.'PrivateKey entry =(PrivateKey)store.getKey(alias,null);'在一個循環中。用卡片鑰匙不打印。當我放入卡時,鑰匙被列出。下次運行時卸下卡讓我問。在任何時候我都被要求輸入我的個人識別碼。 2. CallbackHandler如何幫助我,1.不知道別名,2.想使用MS智能卡提供程序而不是自定義對話框? – 2013-03-06 08:40:18

+0

您可以使用'aliases()'和'isKeyEntry()'從KeyStore請求所有密鑰別名,也許這將有助於檢索密鑰?至於CallbackHandler,如果您獲得PIN提示可能取決於智能卡附帶的軟件的實施。我沒有看到任何需要使用提供者的密鑰提示的要求(並且我個人不希望在應用程序之外提供PIN提示 - 我想知道我使用的密鑰是什麼,但這是個人偏好)。 – 2013-03-07 19:58:33

回答

0

對於Windows的情況,通常智能卡供應商提供兩個驅動程序。

  • 之一來訪問和使用所述PKCS11協議智能卡登入。
  • 其他一個訪問和使用Windows加密服務提供商簽署(又名CSP

當您使用SunMSCAPI提供商可以訪問本地用戶窗口密鑰庫,如果沒有安裝一些CSP智能卡驅動程序在上面;你也可以通過它看到智能卡證書(但是你不知道本地和智能卡之間的區別,因爲Windows密鑰庫充當接口)。

如果您嘗試訪問智能卡的公開證書,但是sunMSCAPI您正在訪問公鑰,因此不需要引入PIN。但是,如果您嘗試執行簽名,那麼Windows密鑰庫將操作委託給智能卡CSP,這將提示您輸入密碼

現在要回答你的兩個具體問題:

  1. 我不知道他的別名可能是(雞蛋的問題)

一種選擇可能是在彈出窗口中打印所有證書(例如主題或序列號)的信息(保持別名和您顯示的描述之間的關係),讓用戶選擇要使用的證書,然後在內部可以使用別名來引用所選 證書;這就像任何https驗證在需要客戶端驗證時一樣工作;瀏覽器向您顯示可能的證書以進行身份​​驗證。

https你可以做一些過濾器中的服務器,只顯示與某些條件匹配哪些證書(例如,你可以過濾一些標準證書Apache的;對於發行的特定CA的例子證明),但最終用戶必須選擇所需的一個來執行驗證。

你也可以做一些類似的過濾器,例如從keystore獲取證書屬性或證書鏈,只顯示你認爲適合哪些請求者......但最後如果在你過濾後有多個已經讓用戶決定選擇哪一個。

  • 如何強制PIN授權與X509Cert與 雖然建立一個HTTPS的SSL上下文的結果?
  • 如果通過sunMSCAPI供應商我認爲你可以不關心PIN委託私鑰訪問操作的智能卡CSP,讓CSP照顧它適合你。

    如果由於某種原因,你需要保持PIN那麼一個可能的選擇是使用不同的供應商(SunPKCS11)直接實例化的智能卡(不通過CSP),並使用CallbackHandler(如@Maarten Bodewes建議在評論中)照顧它。然而,恕我直言,如果在這種情況下所有的客戶端都在Windows上,我建議您像使用sunMSCAPI一樣避免使用不同的智能卡驅動程序實現PKCS11問題。

    相關問題