我最近负责用 Java 模拟 Apple 产品(iPhone 配置实用程序)。我有点卡住的部分之一是关于 Exchange ActiveSync 的部分。在那里,它允许您从钥匙串中选择一个证书以用作您的 EAS 帐户的凭据。经过一番研究,我发现它实际上是在创建一个 PKCS12 密钥库,插入我选择的证书的私钥,并将其编码为 XML。到目前为止没什么大不了的。如果我使用 Keychain Access 创建一个 .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 密钥库中?我什至走在正确的轨道上吗?
提前致谢!