2014-04-15 26 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码由您决定。