我目前正在开展的项目涉及密钥库和证书的管理。因此我使用Java Security API。使用证书的工作很好,但PKCS12-KeyStores的处理有点令人困惑:
我从windows certmgr中导出了一个PKCS12-KeyStore,其中包含一些公共证书(出于测试原因,CA的证书)。 Security API打开相应的文件时没有错误,并且报告没有条目(为了排除个人编程错误,我将使用使用相同Security API的Java keytool来显示错误。)
#$ keytool -list -keystore keystore.pfx -storetype pkcs12
Enter Keystore-Password:
Keystore-Type: PKCS12
Keystore-Provider: SunJSSE
Keystore contains 0 Entries
KeyStore Explorer(不同的程序)会显示所有条目。
如果私钥被添加到KeyStore,它们将被KeyTool识别。
我是否存在普遍的误解,或者这里是什么情况?
提前致谢, 托马斯
答案 0 :(得分:5)
这是标准Java / Sun安全提供程序中KeyStore API实现的限制。
在处理PKCS12密钥库时,标准实现无法处理可信证书条目。尝试编写一个这样的条目将导致不支持的操作异常,读取一个将不会产生任何结果。
但是,它可以处理链接到Key条目的证书条目。
(在此默认实现中,JKS格式更适合于处理同一容器中的受信任条目和密钥条目的单个KeyStore)。 KeyStore(BouncyCastle)的其他实现可以为PKCS12提供更好的支持。
上的已接受答案例如:这会失败,抛出java.security.KeyStoreException: TrustedCertEntry not supported
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(null, null);
ks.setCertificateEntry("test", certificate);
但这有效:
Security.addProvider(new BouncyCastleProvider());
KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);
ks.load(null, null);
ks.setCertificateEntry("test", ca);