java keystore pkcs12_来自CA的PKCS12 Java密钥库和Java中的用户证书

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

提前致谢!

使用PKCS#10格式的证书请求申请PKI证书的一般步骤如下: 1. 生成PKCS#10格式的证书请求,可以使用Java的`sun.security.pkcs10.PKCS10`类完成,示例代码如下: ```java import java.io.IOException; import java.security.*; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import sun.security.pkcs10.PKCS10; import sun.security.x509.X500Name; public class PKCS10Generator { public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, CertificateException, IOException { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048); KeyPair keyPair = keyPairGen.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); X500Name subject = new X500Name("CN=example.com,O=Example Inc.,L=San Francisco,ST=California,C=US"); PKCS10 pkcs10 = new PKCS10(publicKey); Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); pkcs10.encodeAndSign(subject, signature); byte[] p10 = pkcs10.getEncoded(); // 将p10保存到本地文件或发送到证书颁发机构(CA)进行签发 } } ``` 这个示例代码生成一个2048位的RSA密钥对,并使用`sun.security.pkcs10.PKCS10`类生成PKCS#10格式的证书请求,其的`X500Name`类用于指定证书主题,签名算法使用的是`SHA256withRSA`。 2. 将生成的PKCS#10格式的证书请求发送到证书颁发机构(CA)进行签发。CA会验证证书请求的合法性,并为其签发PKI证书。一般情况下,CA会要求申请人提供一些证明身份的材料,例如身份证、营业执照等。 3. 在申请到PKI证书之后,使用Java的`java.security.KeyStore`类将证书导入到Keystore,示例代码如下: ```java import java.io.FileInputStream; import java.security.KeyStore; import java.security.cert.Certificate; public class PKIImport { public static void main(String[] args) throws Exception { String keystoreFile = "/path/to/keystore.jks"; String keystorePassword = "password"; String alias = "alias"; String certFile = "/path/to/cert.cer"; FileInputStream is = new FileInputStream(certFile); CertificateFactory cf = CertificateFactory.getInstance("X.509"); Certificate cert = cf.generateCertificate(is); is.close(); KeyStore ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream(keystoreFile), keystorePassword.toCharArray()); ks.setCertificateEntry(alias, cert); ks.store(new FileOutputStream(keystoreFile), keystorePassword.toCharArray()); } } ``` 这个示例代码从指定路径的证书文件读取PKI证书,然后将证书导入到指定路径的Keystore。在实际应用Keystore一般会使用密码进行保护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值