最近我被委任为在Java中模拟一个苹果产品(iPhone Configuration Utility)。我遇到了一些困难,其中之一是有关Exchange ActiveSync的部分。在那里,它允许您从Keychain中选择证书以用作EAS帐户的凭据。经过一些研究,我发现它实际上创建了一个PKCS12密钥库,插入了我选择的证书的私钥,并将其编码为XML。到目前为止还没有什么大问题。如果我使用Keychain Access创建.p12文件,则上传没有问题。但是,当我尝试将其转移到Java时,遇到了问题。
假设我将之前使用的其中一个证书导出为.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"));
但是当我尝试使用另一个Excel文件时,它会发生问题。
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的Scanner类从控制台读取时,如果用户在输入时不按照要求的格式,会导致程序阻塞或出现异常。有没有一种方法可以让程序跳过错误的输入并继续读取后面的输入?
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密钥库中吗?我是否在正确的路上?
提前感谢!