来自 CA 的 PKCS12 Java 密钥库和 Java 中的用户证书
我最近负责用Java模拟苹果产品(iPhone Configuration Utility)。我一直有点卡住的部分之一是关于Exchange ActiveSync的部分。在那里,它允许您从钥匙串中选择一个证书,以用作EAS帐户的凭据。经过一些研究,我发现它实际上是在创建一个PKCS12密钥库,插入我选择的证书的私钥,并将其编码为XML。到目前为止还没什么大不了的。如果我使用“钥匙串访问”创建一个.p12文件,它可以毫无问题地上传。但是当我试图把它带到Java时,我遇到了一个问题。
假设我将之前与 .p12 文件一起使用的证书之一导出为.cer文件(这是我们期望在环境中获得的证书)。现在,当我将其上传到Java时,我得到一个证书对象,如下所示...
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
所以现在我在这里。有没有人知道如何在Java中将私钥从.cer文件中获取到PKCS12密钥库中?我是否走在正确的轨道上?
提前致谢!