如何获得不可否认性和数字签名证书

时间:2014-02-08 12:17:55

标签: java ssl keystore pki

对于PKI客户端,我需要获得不可否认性和数字签名证书。我已实现此代码以获取这些证书:

keyStore.load(null, null);
Enumeration<String> aliases = keyStore.aliases();
while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
        if (keyStore.isKeyEntry(alias)) {
            java.security.cert.Certificate certificate = keyStore.getCertificate(alias);
        }
}

问题是数字证书和不可否认证书都具有相同的别名。所以当我调用keystore.getCertificate时,系统将始终返回第一个结果,尽管在certmgr.msc窗口中我可以看到存在2个证书且LOOP块执行两次,但系统将始终返回重复结果从第一个证书。我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:2)

你不能真正拥有两个具有相同别名的不同条目。但这就是如何从密钥库中获取所有第一级证书的列表作为列表

List<Certificate> certificates = new ArrayList<Certificate>();
Enumeration<String> aliases = keyStore.aliases();
while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    Certificate certificate = keyStore.getCertificate(alias);
    if (certificate != null) {
        certificates.add(certificate);
    }
}

答案 1 :(得分:1)

由于您正在谈论certmgr.msc并使用keyStore.load(null, null),我认为您正在使用SunMSCAPI provider中的WINDOWS-ROOTWINDOWS-MY密钥库。

不幸的是,有一个issue with this provider因为它可以为多个条目重复使用相同的别名,因此很难或无法访问某些证书。

此密钥库使用的别名实际上是证书的“友好名称”(在MS-CAPI术语中)。虽然友好名称在Windows证书库中不需要是唯一的,但别名必须是。

据推测,因为您似乎在讨论同一实体的两个不同的证书,但目的不同,默认情况下它们可能会使用相同的友好名称。

解决此问题的方法是在Windows商店中识别具有不同友好名称的证书:在certmgr.msc中,选择证书,右键单击,选择“属性”并更改其“友好名称”

如果您有两个具有唯一友好名称的不同证书(针对不同的密钥用法或任何其他原因),那么它们应该在您的KeyStore中显示不同的别名。