Sta*_*ros 13 java encryption pki pkcs#12 x509certificate
我最近负责用Java模拟Apple产品(iPhone配置实用程序).我有点坚持的其中一个部分是关于Exchange ActiveSync的一部分.在那里,它允许您从钥匙串中选择一个证书作为您的EAS帐户的凭据.经过一些研究,我发现它实际上创建了一个PKCS12密钥库,插入了我选择的证书的私钥,并将其编码为XML.到目前为止还没什么大不了的.如果我使用Keychain Access创建一个.p12文件,它上传没有问题.但是当我尝试将其转移到Java时,我遇到了一个问题.
假设我将之前用过的.s12文件中的一个证书导出为.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"));
Run Code Online (Sandbox Code Playgroud)
但是当我尝试......
ks.setCertificateEntry("SomeAlias", userCert);
Run Code Online (Sandbox Code Playgroud)
我得到例外......
java.security.KeyStoreException: TrustedCertEntry not supported
Run Code Online (Sandbox Code Playgroud)
因此,从证书中我转移到密钥上.但是使用这些证书(我也获得了CA证书),我只能访问公钥,而不是私钥.如果我试图像这样添加公钥...
java.security.cert.Certificate[] chain = {CACert};
ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain);
Run Code Online (Sandbox Code Playgroud)
我明白了......
java.security.KeyStoreException: Private key is not stored as PKCS#8 EncryptedPrivateKeyInfo: java.io.IOException: DerValue.getOctetString, not an Octet String: 3
Run Code Online (Sandbox Code Playgroud)
所以现在我在这里.有没有人知道如何从.cer文件中获取私钥到Java中的PKCS12密钥库?我是否走在正确的轨道上?
提前致谢!
Bru*_*uno 17
PKCS#12格式用于存储与证书链相关联的私钥,两者都是必需的(尽管您可能不需要整个链).尽管PKCS12密钥库类型可以很好地将此格式映射到Java KeyStore,但并非所有内容都支持此原因.
您在第一次尝试时尝试做的是自己存储证书,这是行不通的.
您在第二次尝试(ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain))中尝试做的是使用公钥代替应该是私钥(请参阅参考资料KeyStore#setKeyEntry).
.cer文件往往只适用于证书而非私钥(当然,扩展最终只是一个指示).如果.cer从Keychain Access.app导出文件,则不会获得私钥(这是.p12导出格式的用途).
关于KeychainStore的编辑:
如果您尝试进行此转换的原因最终是访问已存在于钥匙串中的私钥和证书,则可以KeychainStore直接从中加载它们:
KeyStore ks = KeyStore.getInstance("KeychainStore", "Apple");
ks.load(null, "-".toCharArray());
Run Code Online (Sandbox Code Playgroud)
有几个注意事项:
"-".toCharArray()),因为操作系统的安全服务会提示访问(就像在其他应用程序中一样).