我最近负责模拟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密钥库中?我是否在正确的轨道上?
提前致谢!