我想通過Sun的MSCAPIProvider從Windows上的Java胖客戶端的智能卡(PKI)獲取用戶身份。我們的目標是:如何使用Java從Windows上的智能卡(MSCAPI)獲取用戶身份?
- 用戶打開應用程序
- 提示卡
- 提示輸入PIN
- 我得到的X509Certicate在Java中
- 授予訪問權限,等等
我已找到基於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()));
現在我面臨兩個問題:
- 我不知道他的別名可能是什麼(雞蛋的問題)
- 怎麼辦我強制使用X509Cert進行PIN授權,並通過HTTPS建立SSL上下文?
哪些是缺失的位?
您是否試圖通過請求存儲中的所有密鑰來過濾掉別名?您是否嘗試添加[CallbackHandler](http://docs.oracle.com/javase/7/docs/api/javax/security/auth/callback/CallbackHandler.html)? – 2013-03-06 00:29:16
1.'PrivateKey entry =(PrivateKey)store.getKey(alias,null);'在一個循環中。用卡片鑰匙不打印。當我放入卡時,鑰匙被列出。下次運行時卸下卡讓我問。在任何時候我都被要求輸入我的個人識別碼。 2. CallbackHandler如何幫助我,1.不知道別名,2.想使用MS智能卡提供程序而不是自定義對話框? – 2013-03-06 08:40:18
您可以使用'aliases()'和'isKeyEntry()'從KeyStore請求所有密鑰別名,也許這將有助於檢索密鑰?至於CallbackHandler,如果您獲得PIN提示可能取決於智能卡附帶的軟件的實施。我沒有看到任何需要使用提供者的密鑰提示的要求(並且我個人不希望在應用程序之外提供PIN提示 - 我想知道我使用的密鑰是什麼,但這是個人偏好)。 – 2013-03-07 19:58:33