PKCS12的Java密钥库处理

Jim*_*lue 3 java security keystore pfx

我当前正在从事的项目涉及密钥库和证书的管理。因此,我使用Java安全性API。使用证书的工作可以很好地退出,但是PKCS12-KeyStores的处理有些混乱:

我从Windows certmgr中导出了PKCS12-KeyStore,其中涉及一些公共证书(出于测试原因,CA证书)。安全API会打开相应的文件而不会出错,并且报告没有条目(为防止个人编程错误,我将通过使用使用相同安全API的Java keytool来显示该错误)。

#$ keytool -list -keystore keystore.pfx -storetype pkcs12 

Enter Keystore-Password:

Keystore-Type: PKCS12
Keystore-Provider: SunJSSE

Keystore contains 0 Entries
Run Code Online (Sandbox Code Playgroud)

但是,KeyStore Explorer(不同的程序)会显示所有条目。

如果将私钥添加到KeyStore,则它们会被KeyTool识别。

我是否有普遍的误解,或者是什么情况?

预先感谢,托马斯

GPI*_*GPI 5

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

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

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

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

请参阅以下网址的已接受答案:使用Java编写使用ssl / tls的客户端服务器应用程序而又无法使用keytool

例如:这将失败,抛出 java.security.KeyStoreException: TrustedCertEntry not supported

KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(null, null);
ks.setCertificateEntry("test", certificate);
Run Code Online (Sandbox Code Playgroud)

但这有效:

Security.addProvider(new BouncyCastleProvider());
KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);
ks.load(null, null);
ks.setCertificateEntry("test", ca);
Run Code Online (Sandbox Code Playgroud)

  • 这是`SunJSSE` 提供者的_真正_不良行为。从 PKCS12 存储类型读取时,不会有单独不支持公共证书的警告。 (2认同)