2011-05-04 107 views
4

我对KeyStore.aliases()的枚举返回值有问题;JDK 1.6上的java.security.Keystore别名与IBM 1.5

FileInputStream is = new FileInputStream("/tmp/file.p12"); 
List<String> aliases = new ArrayList<String>(); 

KeyStore keystore = KeyStore.getInstance("PKCS12"); 
keystore.load(is, password.toCharArray()); 
is.close(); 

Enumeration<String> e=keystore.aliases(); 
while(e.hasMoreElements()) { 
    // never reaches here because "e" is empty 
    System.out.println(e.nextElement().toString()); 
    i++; 
} 

随着 Java版本 “1.6.0_22” 的Java(TM)SE运行时环境(建立1.6.0_22-B04) 爪哇热点(TM)64位服务器VM(构建17.1-B03,混合模式)

我得到一个空的枚举

随着 Java版本 “1.5.0” 的Java(TM)2运行环境,标准版(建设pxi32devifx-20100511a(SR11 FP2)) IBM J9 VM(构建2.3,J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmx i3223ifx-20100510(JIT已启用) J9VM - 20100509_57823_lHdSMr JIT - 20091016_1845ifx7_r8 GC - 20091026_AA) JCL - 20100511a

我能够得到所有的别名。

如何使用Sun/Oracle JDK6检索所有商店pkcs12别名?

感谢

+0

据我所知,keystore在不同的JVM实现中不是二进制兼容的。 (即SUN Java vs IBM Java)。我不认为这与1.5 vs 1.6 – laher 2011-05-04 12:36:07

+0

哪个SecurityProvider在两种情况下提供商店('Keystore.getProvider()')有关? – martijno 2012-06-26 13:46:43

回答

0

似乎没有要任何问题与您的密码给我,我还以为那PKCS#12密钥应该是在所有的JRE的所有版本读取。

您是否尝试过使用OpenSSL来验证您的商店?

+0

> openssl pkcs12 -in /tmp/file.p12 -nokeys -nocerts -info 输入输入密码: MAC迭代1 MAC验证OK PKCS7加密数据:(由我chg)********* ******,迭代1 证件袋 证件袋 钥匙包 证件袋 的keytool -list -v -keystore /tmp/file.p12 keytool的错误(可能是翻译):java.io.IOException异常:无效keystore格式 它适用于openssl,但不适用于基于keytool java的工具 – David 2011-05-04 13:59:25

+0

看起来像sun jdk 1.6无法访问此p12文件格式。但实际上我认为PKCS12是一种通用的文件格式,可以防止密钥库格式之间的兼容性问题。 – David 2011-05-04 15:11:46

+0

如果无法访问PKCS#12存储库,则在调用getInstance(“PKCS12”)时会发生异常,因此它被支持,但有点繁琐。您可以使用Sun创建密钥存储,并使用OpenSSL和IBM打开吗? – 2011-05-04 17:34:24

0

这里的答案:

http://www-01.ibm.com/support/docview.wss?uid=swg1IZ77005

- 问题的结论 此缺陷将被固定在:
1.4.2 SR14
5.0.0 SR12
6.0.0 SR9

PKCS SafeContents.getSafeBags()方法进行了修改,以检测SafeBag数组何时为空,并返回一个空的SafeBag数组。此方法的PKCS调用者已准备好处理空的SafeBag数组。