在 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,但变量 key 和 chain 保持为空,因此密钥库无法检索我的私钥。
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.crt
和 private_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,我误解了你,你让我以正确的方式思考。我面对这四天,所以我现在很兴奋。
我现在面临一个问题,我无法理解为什么我无法读取 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,但变量 key 和 chain 保持为空,因此密钥库无法检索我的私钥。
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.crt
和 private_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,我误解了你,你让我以正确的方式思考。我面对这四天,所以我现在很兴奋。