是否有办法在不使用别名枚举的情况下遍历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