Java keystore 在不使用别名的情况下迭代 Windows-MY

标签 java iteration keystore

是否有任何方法可以在不使用别名枚举的情况下迭代 Windows-MY keystore 。我遇到的问题是,我有一张智能卡,上面有两个具有相同别名的证书,因此当我尝试加载第二个证书时,我会再次获得第一个证书。 目前我像这样迭代证书:

try {
        KeyStore oks = KeyStore.getInstance("Windows-MY", MSProvider);
        oks.load(null, null);
        for (Enumeration l = oks.aliases(); l.hasMoreElements();) {
            certCount++;
            String al = (String) l.nextElement();
            Certificate cert = oks.getCertificate(al);//<<returns the same cert twice
            //do stuff
        }

非常感谢您的帮助。

好吧,事实证明这是 Java Microsoft CryptoAPI KeyStore 实现中的一个已知错误,其中友好名称仅用作别名 - 请参阅 here .

该链接还包含我在下面添加的解决方案,以防链接失效

最佳答案

我在上面的问题中找到的解决方案来自 here .

它涉及使用反射来创建唯一的别名。

private static void _fixAliases(KeyStore keyStore) {
    Field field;
    KeyStoreSpi keyStoreVeritable;

    try {
        field = keyStore.getClass().getDeclaredField("keyStoreSpi");
        field.setAccessible(true);
        keyStoreVeritable = (KeyStoreSpi)field.get(keyStore);

        if("sun.security.mscapi.KeyStore$MY".equals(keyStoreVeritable.getClass().getName())) {
            Collection entries;
            String alias, hashCode;
            X509Certificate[] certificates;

            field = keyStoreVeritable.getClass().getEnclosingClass().getDeclaredField("entries");
            field.setAccessible(true);
            entries = (Collection)field.get(keyStoreVeritable);

            for(Object entry : entries) {
                field = entry.getClass().getDeclaredField("certChain");
                field.setAccessible(true);
                certificates = (X509Certificate[])field.get(entry);

                hashCode = Integer.toString(certificates[0].hashCode());

                field = entry.getClass().getDeclaredField("alias");
                field.setAccessible(true);
                alias = (String)field.get(entry);

                if(!alias.equals(hashCode)) {
                    field.set(entry, alias.concat(" - ").concat(hashCode));
                } // if
            } // for
        } // if
    } catch(Exception exception) {
        System.err.println(exception);
        exception.printStackTrace();
    } // catch
} // _fixAliases

关于Java keystore 在不使用别名的情况下迭代 Windows-MY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30577428/

相关文章:

java - 使用 SmartPls 更改 Excel 文件中的工作表

java - 瓷砖 3 : get current definition name inside a JSP

java - 如何使用 JUNG 的注释系统注释我的图表?

java - 为什么 Date 对象返回错误的日期?

定义有效案例的算法/迭代

tomcat - 最佳实践 : bundling tomcat and configuring SSL with a keystore

带有 KeyStore 和 ServerSockets 的 Java SSL/TLS

python - Openerp NotImplementedError : Iteration is not allowed on browse_record(stock. 移动,159275)

java - 将 array_walk 从 php 转换为 java 方法

java - 如何克隆 java keystore 实例?