如何在一个crt文件中导出多个公共证书

时间:2014-07-11 10:04:35

标签: java private x509certificate keystore public

我有一个带有多个证书的keystore.jks文件,包括公钥和私钥。 现在我想知道如何将所有公钥证书导出到新文件all-public-cert.crt文件中。

这是" all-public-cert.crt"文件仅包含证书(仅限公钥)。不应该在此文件中包含任何私钥。

在此之后我想准备好这个" all-public-cert.crt"通过java代码提交文件,并使用质询响应验证公钥和私钥。

请指导我或建议我一些参考文件或网址。

注意:我可以使用任何工具,如openssl或keytool。

谢谢&问候, Gaurav Paliwal

1 个答案:

答案 0 :(得分:1)

通常是密钥库,即您的keystore.jks包含私钥和相应的X.509证书。但是X.509证书不包含私钥,因为你错误地认为:

I have a keystore.jks file with multiple certificate including public and private key

This "all-public-cert.crt" file contain only certificate (public key only) . should not contain any private key in this file.

这意味着您的X.509证书仅包含公钥信息,不包含私钥信息。

为了从您的密钥库中获取证书(将错误处理放在一边):

String keystorePath = ....
InputStream is = new FileInputStream(new File(keystorePath));
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(is, "keystorePassword".toCharArray());

Enumeration e = ks.aliases();
Set<Certificate> certs = new HashSet<Certificate>();
while (e.hasMoreElements()) {
  Certificate cert = ks.getCertificate((String) enumeration.nextElement());
  certs.add(cert);
}

现在,您拥有certs集中的所有证书。但为什么你需要将它们全部放入all-public-cert.crt

1。)首先,您不能将多个证书放在一个文件中,并希望可以以“正常”方式使用该文件(例如,双击打开它,将其导入其他应用程序,......)。该文件将是垃圾,只能从您的应用程序中读取

2。)因此,文件扩展名不应为.crt,应为.myExportedCertificates或类似内容。

我认为您只想将证书存储在文件系统中,以便以后使用它们。在这种情况下,只需使用此代码(错误处理是您的工作):

String pathToStoreTheCerts = ...
File path = new File(pathToStoreTheCerts);
OutputStream os = null;
for (X509Certificate cert : certs) {
  File certFile = new File(path, cert.getSubjectX500Principal().getName() + ".crt");
  os = new FileOutputStream(certFile);
  os.write(cert.getEncoded());
  os.flush();
}
os.close();