PKCS#11驱动程序会提示输入每个密钥的PIN

uı6*_*uɐp 4 java pki pkcs#11

我使用西门子的CardOS API驱动程序作为PKCS#11驱动程序从PKI卡加载证书,如下所示:

char[] pin = "123456".toCharArray();
KeyStore.PasswordProtection pp = new KeyStore.PasswordProtection(pin);
KeyStore keyStore = KeyStore.Builder.newInstance("PKCS11", Security.getProvider("SunPKCS11-verinice"), pp).getKeyStore();
keyStore.load(null,pin);
keyStore.getKey("key 1", pin);
keyStore.getKey("key 2", pin);
Run Code Online (Sandbox Code Playgroud)

尽管我将其作为参数传递,但驱动程序会提示输入每个密钥的PIN.有没有其他方法可以通过API传递PIN码?我可以激活任何"PIN缓存"吗?

Bru*_*uno 5

您可以使用CallbackHandler能够处理a 的自定义PasswordCallback,如Java PKCS#11指南的3.1节所述.当然,缓存密码应该谨慎小心.


小智 3

我还使用 CardOS 和西门子卡。

一张卡上有两个 PIN 码。

  1. 卡密码。用于解锁卡并读取证书。您可以使用自己的回调处理此 PIN。PIN 码仅需一次。
  2. 签名 PIN。用于访问合格的签名证书。每个签名都必须输入此 PIN。PIN 对话框来自西门子中间件,您无法将其关闭。

在大多数情况下,两个 PIN 是相同的(否则用户会感到困惑)。我还有一张没有签名 PIN 码的卡。有了这个我就可以签名而无需输入其他 PIN 码。也许您可以删除签名 PIN 码或获取没有签名 PIN 码的卡。