使用setCertificateEntry(cert)将密钥库对象中的pkcs#11证书添加失败

时间:2016-11-15 17:01:14

标签: java keystore smartcard pkcs#11

注意

我不想将证书导入到keytool的密钥库中。我想要的是将java.security.cert.Certificate对象添加到java.security.KeyStore对象中。

方案

我的应用程序使用FireFox用户证书和智能卡中的NSS + JSS。 APP首先通过NSS加载所有用户证书并将它们存储到KeyStore对象中,然后存储它们的SN,DN等。然后,使用org.mozilla.jss.CryptoManager我加载所有外部模块,然后加载模块的每个标记最后,通过这一行,我得到一个CryptoStore,其中包含令牌的所有证书:

CryptoStore store = null;
store = token.getCryptoStore();
org.mozilla.jss.crypto.X509Certificate[] certs = store.getCertificates();

然后,我阅读这些证书并存储他们的SN,DN等,以及用户证书的数据,以便显示UI部分。

进行身份验证时,系统会提示用户选择要包含所有证书的对话框。此窗口有一个表,其中包含每个证书alias的行,用户的+卡。然后,我使用选定的keyStorealias中选择证书。

错误

问题出现了:keyStore只有来自FireFox的用户证书条目,而不是卡片中的用户证书条目。如果我从卡中选择一个,并执行此操作:

certificate = keyStore.getCertificate(alias);

返回null。这是有道理的,因为卡中的那些存储在CryptoStore中。现在,如果我这样做:

keyStore.setCertificateEntry(alias, cert); //cert is a certificate from card

没有异常发生。然后,当我再次这样做时:

certificate = keyStore.getCertificate(alias);

来自NullPointerException的{​​{1}}发生。

问题

  • 我的方法可以将智能卡中的证书添加到sun.security.pkcs11.p11keyStore.P11KeyStore.getID()吗?

  • 为什么例外?

0 个答案:

没有答案