2014-04-15 25 views
4

我有一個用於數字簽名的小程序。我的問題是初始化密鑰庫,但它保持打開,直到您關閉瀏覽器。每次我想要簽名時,我怎樣才能問問別針?總是要求引腳KeyStore PKCS11

這是初始化代碼:

/* Se obtiene el proveedor del contenedor de claves */ 
pkcs11config = "name=Athena\nlibrary=C:\\Windows\\system32\\asepkcs.dll"; 
byte[] pkcs11configBytes1 = pkcs11config.getBytes(); 
ByteArrayInputStream configStream1 = new ByteArrayInputStream(pkcs11configBytes1); 
BouncyCastleProvider providerBC = new BouncyCastleProvider(); 

Security.addProvider(providerBC); 
//Cargo el proveedor de la CIPE 
providerPKCS11 = new SunPKCS11(configStream1); 
Security.addProvider(providerPKCS11); 
ks = KeyStore.getInstance("PKCS11", providerPKCS11); 
ks.load(null, null); 

誰能告訴我如何解決它?謝謝。

+0

如果Java允許您這樣做,則需要以某種方式卸載applet中的PKCS1驅動程序。然後下一次激活將需要再次輸入PIN碼。 –

回答

2

PKCS#11提供商僅在需要時纔會要求輸入PIN碼。如果爲正在使用的令牌密鑰設置了CKA_ALWAYS_AUTHENTICATE標誌,則只需要每個操作。爲了允許輸入用戶PIN,必須根據PKCS#11 provider documentation執行回叫處理程序。

+3

在現實生活中,CKA_ALWAYS_AUTHENTICATE更像是一種提示,而不是功能。當調用應用程序決定與用戶交互時,調用應用程序「請求引腳」。因爲該應用程序調用C_Login。一些PKCS#11提供者通過打開GUI窗口等自身與用戶交互。實際上,他們代表調用應用程序對CKR_USER_NOT_LOGGED_ON或類似情況做出反應。 –

+1

這當然是對的。但是,如果'CKA_ALWAYS_AUTHENTICATE'不是使用回調過程處理的,那麼您可以對此做很少的事情。您可以嘗試的唯一方法是在開始操作之前每次都登錄,但我不確定可以從PKCS#11提供商處獲得這樣做的API,因此您需要較低級別的訪問權限。 –

+0

好的,如何設置CKA_ALWAYS_AUTHENTICATE標誌? – Fernando

1

PKCS#11共享所有會話之間的登錄狀態,因此您應該撥打providerPKCS11.logout();並且您應該從所有PKCS#11會話中註銷 - 簽名操作應該失敗。使用正確的PIN碼重新加載KeyStore應在所有會話中再次登錄 - 簽名操作應成功。向用戶顯示GUI並要求他在每次簽名操作之前輸入PIN碼由您決定。