从Java 6上的密钥库提取证书

从Java 6上的密钥库提取证书,java,keystore,keytool,java-6,Java,Keystore,Keytool,Java 6,我现在面临一个问题,我不明白为什么我不能阅读Java6上的密钥库。零件代码如下所示: KeyStore ks = KeyStore.getInstance("jks"); FileInputStream file = new FileInputStream(<path to file>); ks.load(file, <password>); String alias = (String)ks.aliases().nextElement(); PrivateKey ke

我现在面临一个问题,我不明白为什么我不能阅读Java6上的密钥库。零件代码如下所示:

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);
KeyStore ks=KeyStore.getInstance(“jks”);
FileInputStream文件=新的FileInputStream();
加载(文件,);
字符串别名=(字符串)ks.alias().nextElement();
PrivateKey=(PrivateKey)ks.getKey(别名,ConstantsUtils.CERT_PASS.toCharArray());
证书[]链=ks.getCertificateChain(别名);
我正在使用此证书对Java代码中的PDF进行签名,但变量keychain保持为空,因此密钥库无法检索我的私钥

密钥库是通过keytool导入带有下一行(Windows 7)的证书创建的:


C:\Program Files\Java\jdk1.6.0\u 37\bin>keytool-importcert-file”“-keystore您正在导入证书。除非它对应于密钥库中已经存在的私钥,并且您不同意“trust CA certs”(信任CA证书)提示,否则这将创建一个受信任的证书,并且通过
PrivateKey
查找它将失败

如果您要从第三方导入证书,您将没有他们的私钥,除非他们非常不称职


简而言之,您所做的没有意义。

您正在导入证书。除非它对应于密钥库中已经存在的私钥,并且您不同意“trust CA certs”(信任CA证书)提示,否则这将创建一个受信任的证书,并且通过
PrivateKey
查找它将失败

如果您要从第三方导入证书,您将没有他们的私钥,除非他们非常不称职


简而言之,你所做的毫无意义。

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

我的问题是我有两个文件,一个是证书(我们称之为
certificate.crt
),另一个是私钥(我们称之为
private\u key.pem
)。如前所述,问题在于私钥导入过程。我有两个不同的文件,所以我只是将
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 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);
KeyStore ks=KeyStore.getInstance(“PKCS12”);
FileInputStream文件=新的FileInputStream();
加载(文件,);
字符串别名=(字符串)ks.alias().nextElement();
PrivateKey=(PrivateKey)ks.getKey(别名,ConstantsUtils.CERT_PASS.toCharArray());
证书[]链=ks.getCertificateChain(别名);

就这些。谢谢你,伊普,我误解了你,你让我用正确的方式思考。我四天都在面对这个问题,所以我现在非常激动。

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

我的问题是我有两个文件,一个是证书(我们称之为
certificate.crt
),另一个是私钥(我们称之为
private\u key.pem
)。如前所述,问题在于私钥导入过程。我有两个不同的文件,所以我只是将
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 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);
KeyStore ks=KeyStore.getInstance(“PKCS12”);
FileInputStream文件=新的FileInputStream();
加载(文件,);
字符串别名=(字符串)ks.alias().nextElement();
PrivateKey=(PrivateKey)ks.getKey(别名,ConstantsUtils.CERT_PASS.toCharArray());
证书[]链=ks.getCertificateChain(别名);

就这些。谢谢你,伊普,我误解了你,你让我用正确的方式思考。我四天都在面对这个问题,所以我现在非常激动。

这只是一个签署PDF文档的证书,以前是在Java级别生成的,我只需要一种方式来阅读它并在这个文档上盖章。除非你有私钥,否则你不能用它签署任何东西。您的整个问题似乎完全被误解了。问题是,我使用keytool将证书(也包括私钥)导入了我的密钥库,然后我想读取该私钥以用于签署我的PDF。问题是,虽然我可以打开密钥库并在调试器中查看所有数据,但我无法读取该私钥。您对导入私钥没有任何疑问。它提到通过导入证书来创建密钥库。我需要访问私钥,因为我必须在PDF上签名。我有.crt和.pem文件,那么,我如何从Java访问这些内容呢?这只是一个签署PDF文档的证书,以前是在Java级别生成的,我只需要一种读取该文档并在该文档上盖章的方法。除非你有私钥,否则你不能用它签署任何东西。您的整个问题似乎完全被误解了。问题是,我使用keytool将证书(也包括私钥)导入了我的密钥库,然后我想读取该私钥以用于签署我的PDF。问题是,虽然我可以打开密钥库并在调试器中查看所有数据,但我无法读取该私钥。您对导入私钥没有任何疑问。它提到通过导入证书来创建密钥库