在Windows-MY上迭代而不使用别名



是否有办法在不使用别名枚举的情况下遍历Windows-MY密钥存储库?我遇到的问题是,我有一个智能卡,上面有两个证书,具有相同的别名,所以当我试图加载第二个证书时,我再次获得第一个证书。目前,我像这样遍历证书:

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实现中的一个已知错误,其中友好名称仅用作别名-请参阅这里。

这个链接还包含了我在下面添加的解决方案,以防链接断开

我从这里找到了上面问题中提到的解决方案。

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

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

最新更新