【问题标题】:convert CertStore into X509Certificate[ ] array JAVA将 CertStore 转换为 X509Certificate[ ] 数组 JAVA
【发布时间】:2017-10-16 16:03:19
【问题描述】:

我创建了一个证书存储,并想从该类的另一个函数中添加另一个证书。

使用caCertintermediateCert 在类 1 中创建链:

List<X509Certificate> certList = new ArrayList<X509Certificate>();
certList.add(0, interCert);
certList.add(1, caCert);
Store<X509Certificate> certs = new JcaCertStore(certList);
certStore = new JcaCertStoreBuilder().addCertificates(certs).build();

我想在类 2 中添加一个新的构建用户证书:

certStore = new JcaCertStoreBuilder().addCertificate(certHolder).build();

要将新密钥保存到我的KeyStore,我需要一个证书数组(X509Certificate[])。如何将 certStore 文件转换为数组以使 privatekeyentry 工作?

PrivateKeyEntry privKeyEntry = new PrivateKeyEntry(pair.getPrivate(), chain);
store.setEntry(alias, privKeyEntry, new KeyStore.PasswordProtection(storePassword));

【问题讨论】:

  • 你在使用 bouncycastle 吗?
  • 是的,我确实使用 bouncycastle。

标签: java arrays certificate bouncycastle keystore


【解决方案1】:

我正在使用 BouncyCastle 1.56JDK 1.7

我认为最简单的方法是从证书存储中获取所有证书并将它们添加到数组中(而不是创建另一个证书存储并进行转换)。

要获取证书存储中的所有证书,您可以:

// get all certificates in certStore
Collection<? extends Certificate> allCerts = certStore.getCertificates(null);

某些实现不接受null 参数。在这种情况下,您必须创建一个像这样的选择器(使用java.security.cert.X509CertSelector 类):

Collection<? extends Certificate> allCerts = certStore.getCertificates(new X509CertSelector() {
    @Override
    public boolean match(Certificate cert) {
        // match all certificates (so it'll return all of them)
        return true;
    }
});

之后,allCerts 将拥有certStore 中的 2 个证书。

现在您创建数组并添加您需要的所有证书:

// create array
X509Certificate[] certificatesArray = new X509Certificate[3];

// add certificates in allCerts (the 2 that were in certStore)
int i = 0;
for (Certificate c : allCerts) {
    certificatesArray[i] = (X509Certificate) c;
    i++;
}

// add the new certificate (newCert being a X509Certificate)
certificatesArray[2] = newCert;

注意: 如果您的新证书类型是 org.bouncycastle.cert.X509CertificateHolder,您可以使用 org.bouncycastle.cert.jcajce.JcaX509CertificateConverter 类将其转换为 java.security.cert.X509Certificate

X509CertificateHolder certHolder = ...;
X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder);

或者您可以使用 java.security.cert.CertificateFactory 手动完成:

X509CertificateHolder certHolder = ...;
CertificateFactory f = CertificateFactory.getInstance("X509");
X509Certificate cert = (X509Certificate) f.generateCertificate(new ByteArrayInputStream(certHolder.getEncoded()));

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多