【发布时间】:2015-04-21 06:35:13
【问题描述】:
我在尝试导出 pkcs12 文件中包含的公钥时遇到问题。我想要达到的结果与使用此命令的结果相同(但以编程方式):
keytool -export -alias mycertalias -keystore mykeystore.jks -rfc -file mypublickey.pem
我获得了公钥并使用 BouncyCastle 生成了一个字符串,但是获得的结果与我使用上面的命令获得的结果不匹配。这是我的代码:
KeyStore keyStore = KeyStore.getInstance("pkcs12");
keyStore.load(new FileInputStream(certPath),certPassword.toCharArray());
String alias = "mycertalias";
Certificate cert = keyStore.getCertificate(alias);
PublicKey publicKey = cert.getPublicKey();
StringWriter writer = new StringWriter();
PemWriter pemWriter = new PemWriter(writer);
pemWriter.writeObject(new PemObject("CERTIFICATE", publicKey.getEncoded()));
pemWriter.flush();
pemWriter.close();
System.out.println(writer.toString());
我尝试过不使用 BouncyCastle 并直接对字符串进行编码,但我得到的结果与以前相同(因此它与使用 keytool 命令获得的结果也不匹配):
Certificate cert = keyStore.getCertificate(alias);
BASE64Encoder encoder = new BASE64Encoder();
PublicKey publicKey = cert.getPublicKey();
System.out.println(new String(encoder.encode(publicKey.getEncoded())));
知道我做错了什么吗?提前感谢您的帮助。
更新:
正如@dave_thompson_085 所建议的那样,我真正想要的是以 PEM 格式导出整个证书,所以有效代码是这样的:
//...
Certificate cert = keyStore.getCertificate(alias);
StringWriter writer = new StringWriter();
PemWriter pemWriter = new PemWriter(writer);
pemWriter.writeObject(new PemObject("CERTIFICATE", cert.getEncoded()));
//...
谢谢!
【问题讨论】:
-
pemWriter.writeObject(new PemObject("CERTIFICATE", publicKey.getEncoded()));这行对我来说似乎有问题,你应该将 PublicKey 转换为 Bouncycastle 格式:SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(publicKey.getEncoded());虽然我认为即使这一步是不必要的,只需写pemWriter.writeObject(publicKey.getEncoded()); -
BC 的 PemWriter 的当前版本只接受 PemObjectGenerator 作为参数,它不再接受字节数组:
public void writeObject(PemObjectGenerator objGen) -
哦。很高兴知道,谢谢。我想我正在查看一个较旧的来源。
标签: java bouncycastle public-key