我正在使用以下代码从Athena智能卡读取器访问PKCS#11智能卡的内容。

Provider pkcs11Provider = new SunPKCS11(new ByteArrayInputStream (config.getBytes()));
if (Security.getProvider(pkcs11Provider.getName()) != null) {
    Security.removeProvider(pkcs11Provider.getName());
}

Security.addProvider(pkcs11Provider);

KeyStore myKeyStore = KeyStore.getInstance ("PKCS11", pkcs11Provider);
myKeyStore.load(null, keystore_password.toCharArray());

return myKeyStore;

问题如下:
  • 我输入了错误的密码。
  • 代码引发异常(按预期)。
  • 我输入正确的密码。
  • 代码不会引发异常(按预期)。
  • 我输入了错误的密码。
  • 代码不会引发异常(意外)。

  • 根据http://docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html的说明,当使用KeyStore.Builder类时,使用同一智能卡首次成功加载后,无需输入密码。当然,我不在上面的代码中使用此类。同样的事情适用于KeyStore.getInstance(...)方法吗?无论先前尝试加载什么,是否都可以通过任何方法使密钥库在输入错误密码时引发异常?

    最佳答案

    试试这个

    ((SunPKCS11) pkcs11Provider ).logout();
    pkcs11Provider.clear();
    

    如果这样做没有帮助,请在每次登录前用新创建的SunPKCS11对象替换该提供程序

    10-06 13:33