在 Java 6 从密钥库中提取证书

Extracting Certificate from Keystore on Java 6

我现在面临一个问题,我无法理解为什么我无法读取 Java 上的 KeyStore 6. 代码如下:

KeyStore ks = KeyStore.getInstance("jks");
FileInputStream file = new FileInputStream(<path to file>);
ks.load(file, <password>);
String alias = (String)ks.aliases().nextElement();

PrivateKey key = (PrivateKey)ks.getKey(alias, ConstantsUtils.CERT_PASS.toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);

我正在使用此证书从 Java 代码签署 PDF,但变量 keychain 保持为空,因此密钥库无法检索我的私钥。

Keystore 是通过 keytool 使用下一行 (Windows 7) 导入证书创建的:

C:\Program Files\Java\jdk1.6.0_37\bin>keytool -importcert -file "<path to cert>" -keystore <path to keystore -alias "<alias>" -keypass <password> -storepass <password>

导入的证书来自第三方,应该可以正常使用。我不知道导入证书是否有问题,或者我是否以错误的方式编码。

您正在导入证书。除非它对应于 KeyStore 中已有的私钥,并且您不同意 'trust CA certs?' 提示,否则这将创建一个受信任的证书,并且通过 PrivateKey 查找它会失败。

如果您从第三方导入证书,您将不会拥有他们的私钥,除非他们非常无能。

简而言之,你在做什么没有意义。

好吧,我终于找到了最终的解决方案。

我的问题是我有 2 个文件,一个是证书(我们称之为 certificate.crt),另一个是私钥(我们称之为 private_key.pem)。正如 EJP 之前所说,问题出在私钥导入过程中。我有 2 个不同的文件,所以我只将 certificate.crt 文件导入到 .jks 文件,当我尝试导入时 private_key.pem 给了我一个错误(很明显)。所以我的解决方案是使用以下命令将两个文件(certificate.crtprivate_key.pem)合并到一个 PKCS#12 文件中:

openssl pkcs12 -inkey private_key.pem -in certificate.cert -export -out certificate.pfx

现在,新的 certificate.pfx 是一个 keystore,其中包含 public 和私钥,格式正确,我的代码做了一些更改可以获取私钥并签署我的文档:

KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream file = new FileInputStream(<path to .pfx file>);
ks.load(file, <password>);
String alias = (String)ks.aliases().nextElement();

PrivateKey key = (PrivateKey)ks.getKey(alias, ConstantsUtils.CERT_PASS.toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);

就这些了。谢谢 EJP,我误解了你,你让我以正确的方式思考。我面对这四天,所以我现在很兴奋。