Java KeyStore- PKCS12的处理

时间:2015-01-20 15:47:47

标签: java security keystore pfx

我目前正在开展的项目涉及密钥库和证书的管理。因此我使用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识别。

我是否存在普遍的误解,或者这里是什么情况?

提前致谢, 托马斯

1 个答案:

答案 0 :(得分:5)

这是标准Java / Sun安全提供程序中KeyStore API实现的限制。

在处理PKCS12密钥库时,标准实现无法处理可信证书条目。尝试编写一个这样的条目将导致不支持的操作异常,读取一个将不会产生任何结果。

但是,它可以处理链接到Key条目的证书条目。

(在此默认实现中,JKS格式更适合于处理同一容器中的受信任条目和密钥条目的单个KeyStore)。 KeyStore(BouncyCastle)的其他实现可以为PKCS12提供更好的支持。

请参阅:Writing a client-server application that uses ssl / tls using java without beeing able to use keytool

上的已接受答案

例如:这会失败,抛出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);