认证链只包含一个位置 - Java& PKCS11

时间:2012-11-13 21:06:03

标签: java certificate pkcs#11

我试图用我的智能卡签名我的文件。我像这样初始化我的密钥库:

String pkcs11config = "name = CertumSmartCard \n" + "library = "
            + new File(".").getAbsolutePath() + "/cryptoCertum3PKCS.dll";
Provider pkcs11Provider = new SunPKCS11(new ByteArrayInputStream(
                pkcs11config.getBytes()));
Security.addProvider(pkcs11Provider);
KeyStore keyStore = KeyStore.getInstance("PKCS11", pkcs11Provider);
keyStore.load(null, pin.toCharArray());

然后我尝试使用以下方法读取证书链:

Enumeration<String> aliasesEnum = keyStore.aliases();
String alias = null;
while (aliasesEnum.hasMoreElements()) {
alias = aliasesEnum.nextElement();
Certificate[] certChain = keyStore.getCertificateChain(alias);
(...)
}

但不幸的是,我的链中只有一个证书(此卡的所有者证书)。我没有任何受信任的根证书,因此在验证期间,我收到一个错误,即该文件是使用不受信任的证书签名的。

你知道吗?我应该使用SunPKSC11课吗?它不适用于java 7(我使用java 6),看起来不赞成使用它。还有其他图书馆可以进入卡片的胆量吗?

2 个答案:

答案 0 :(得分:0)

实际上这张卡只包含一张证书,所以我的代码工作正常。我手动添加了丢失的证书并将它们连接到链中。有了这条链,我可以签署我的文件。我从其他应用程序(proCertum智能卡)中保存了这些证书,这些证书通常用于使用此类证书的唱歌文件。

答案 1 :(得分:-1)

我认为你的问题在while循环中:

while (aliasesEnum.hasMoreElements()) {
alias = aliasesEnum.nextElement();
**Certificate[] certChain = keyStore.getCertificateChain(alias);**
(...)
}

在这种情况下,您将只获得一个带有最后别名的证书。

所以,我建议您将代码更改为:

Certificate[] certChain = new Certificate[NumnberOfYourCertificates];
int count = 0 ;
while (aliasesEnum.hasMoreElements()) {
alias = aliasesEnum.nextElement();
certChain[count++] = keyStore.getCertificateChain(alias);
(...)
}

我认为它会奏效。