PKCS#12格式用于存储与证书链关联的私钥,并且两者都是必需的(尽管您可能不需要整个链)。尽管
PKCS12密钥库类型在将这种格式映射到Java方面做得很好
KeyStore,但是由于这个原因,并非所有内容都受支持。
您第一次尝试要做的是自己存储证书,这是行不通的。
第二次尝试(
ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEnpred(),chain))中要执行的操作是使用公钥代替应该是私钥的东西(请参阅参考资料KeyStore#setKeyEntry)。
.cer文件通常仅用于证书而不是私钥(当然,扩展名最终仅是一种指示)。如果
.cer从 Keychain Access.app
导出文件,则不会获得私钥(这就是
.p12导出格式的用途)。
编辑 有关KeychainStore的内容:
如果您尝试进行此转换的原因最终是访问钥匙串中已存在的私钥和证书,则可以
KeychainStore直接从中加载它们:
KeyStore ks = KeyStore.getInstance("KeychainStore", "Apple");ks.load(null, "-".toCharArray());一些注意事项:
- 任何非空,非空的密码都将使用私钥(例如
"-".toCharArray()
),因为访问将由操作系统的安全服务提示(就像在其他应用程序中一样)。 - 据我所知,仍然存在一个错误,它仅允许访问一个私钥/证书对(即使钥匙串中存在许多对私钥/证书对)



