我有一个带有多个证书的keystore.jks文件,包括公钥和私钥。 现在我想知道如何将所有公钥证书导出到新文件all-public-cert.crt文件中。
这是" all-public-cert.crt"文件仅包含证书(仅限公钥)。不应该在此文件中包含任何私钥。
在此之后我想准备好这个" all-public-cert.crt"通过java代码提交文件,并使用质询响应验证公钥和私钥。
请指导我或建议我一些参考文件或网址。
注意:我可以使用任何工具,如openssl或keytool。
谢谢&问候, Gaurav Paliwal
答案 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();