来自CA的PKCS12 Java密钥库和Java中的用户证书

我最近负责模拟Java中的Apple产品(iPhone配置实用程序)。我一直停留的部分内容之一是有关Exchange

ActiveSync的部分。在其中,它允许您从钥匙串中选择一个证书,以用作EAS帐户的凭据。经过研究,我发现它实际上是在创建PKCS12密钥库,将我选择的证书的私钥插入,并将其编码为XML。到目前为止,没什么大不了的。如果我使用钥匙串访问权限创建了.p12文件,则该文件可以顺利上传。但是,当我尝试将其引入Java时遇到了一个问题。

假设我将以前与.p12文件一起使用的那些证书之一导出为.cer文件(这是我们期望在环境中获得的证书)。现在,当我将其上传到Java时,我得到一个Certificate对象,如下所示:

KeyStore ks = java.security.KeyStore.getInstance("PKCS12");

ks.load(null, "somePassword".toCharArray());

CertificateFactory cf = CertificateFactory.getInstance("X.509", new BouncyCastleProvider());

java.security.cert.Certificate userCert = cf.generateCertificate(new FileInputStream("/Users/me/Desktop/RecentlyExportedCert.cer"));

但是当我尝试…

ks.setCertificateEntry("SomeAlias", userCert);

我有例外…

java.security.KeyStoreException: TrustedCertEntry not supported

因此,从证书开始,我将重点放在密钥上。但是有了这些证书(我也获得了CA证书),我只能访问公钥,而不能访问私钥。如果我尝试像这样添加公钥…

java.security.cert.Certificate[] chain = {CACert};

ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain);

我知道了

java.security.KeyStoreException: Private key is not stored as PKCS#8 EncryptedPrivateKeyInfo: java.io.IOException: DerValue.getOctetString, not an Octet String: 3

所以现在我在这里。有谁知道如何从.cer文件中获取私钥到Java中的PKCS12密钥库中?我是否在正确的轨道上?

提前致谢!

回答:

PKCS#12格式用于存储与证书链关联的私钥,并且两者都是必需的(尽管您可能不需要整个链)。尽管PKCS12密钥库类型在将这种格式映射到Java方面做得很好KeyStore,但是由于这个原因,并非所有内容都受支持。

您第一次尝试要做的是自己存储证书,这是行不通的。

第二次尝试(ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(),

chain))中要执行的操作是使用公钥代替应该是私钥的东西(请参阅参考资料KeyStore#setKeyEntry)。

.cer文件通常仅用于证书而不是私钥(当然,扩展名最终仅是一种指示)。如果.cerKeychain Access.app

导出文件,则不会获得私钥(这就是.p12导出格式的用途)。

有关KeychainStore的内容:

如果您尝试进行此转换的原因最终是访问钥匙串中已存在的私钥和证书,则可以KeychainStore直接从中加载它们:

KeyStore ks = KeyStore.getInstance("KeychainStore", "Apple");

ks.load(null, "-".toCharArray());

一些注意事项:

  • 任何非空,非空的密码都将使用私钥(例如"-".toCharArray()),因为访问将由操作系统的安全服务提示(就像在其他应用程序中一样)。
  • 据我所知,仍然存在一个错误,它仅允许访问一个私钥/证书对(即使钥匙串中存在许多对私钥/证书对)

以上是 来自CA的PKCS12 Java密钥库和Java中的用户证书 的全部内容, 来源链接: utcz.com/qa/399554.html

回到顶部