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

时间:2011-08-09 12:34:09

标签: 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);

虽然我将其作为参数传递,但驱动程序会提示输入每个键的PIN。有没有其他方法可以通过API传递PIN码?我可以激活任何“PIN缓存”吗?

3 个答案:

答案 0 :(得分:5)

您可以使用能够处理CallbackHandler的自定义PasswordCallback,如section 3.1 of the Java PKCS#11 guide中所述。当然,缓存密码应该谨慎使用。

答案 1 :(得分:2)

您应该向您的PKCS#11供应商询问此问题,在本例中为西门子。你可以用Java做任何事情。

答案 2 :(得分:2)

我也在使用CardOS和西门子卡。

卡上有两个PIN码。

  1. 卡密码。用于解锁卡并读取证书。您可以使用自己的回调来处理此PIN。 PIN只需一次。
  2. 签名密码。用于访问合格的签名证书。必须为每个签名输入此PIN。 PIN对话框来自西门子中间件,您不能将其解雇。
  3. 在大多数情况下,两个PIN都是相同的(否则用户会感到困惑)。 我还有一张没有签名密码的卡片。有了这个,我可以签名,没有其他PIN条目。也许您可以删除签名PIN或获取没有签名PIN的卡。