Java - 如何将密钥存储在密钥库中

19

我需要将两个密钥存储到KeyStore中。 以下是相关的代码:

KeyStore ks = KeyStore.getInstance("JKS");
String password = "password";
char[] ksPass = password.toCharArray();
ks.load(null, ksPass);
ks.setKeyEntry("keyForSeckeyDecrypt", privateKey, null, null);
ks.setKeyEntry("keyForDigitalSignature", priv, null, null);
FileOutputStream writeStream = new FileOutputStream("key.store");
ks.store(writeStream, ksPass);
writeStream.close();

虽然我得到了一个异常 "Private key must be accompanied by certificate chain",这是什么意思?我该如何生成它呢?

1个回答

19

您还需要提供私钥条目的证书(公钥)。对于由CA签名的证书,链是CA的证书和终端证书。对于自签名证书,您只需要自签名证书。

示例:

KeyPair keyPair = ...;//You already have this  
X509Certificate certificate = generateCertificate(keyPair);  
KeyStore keyStore = KeyStore.getInstance("JKS");  
keyStore.load(null,null);  
Certificate[] certChain = new Certificate[1];  
certChain[0] = certificate;  
keyStore.setKeyEntry("key1", (Key)keyPair.getPrivate(), pwd, certChain);  

按照链接生成证书:
示例:

public X509Certificate generateCertificate(KeyPair keyPair){  
   X509V3CertificateGenerator cert = new X509V3CertificateGenerator();   
   cert.setSerialNumber(BigInteger.valueOf(1));   //or generate a random number  
   cert.setSubjectDN(new X509Principal("CN=localhost"));  //see examples to add O,OU etc  
   cert.setIssuerDN(new X509Principal("CN=localhost")); //same since it is self-signed  
   cert.setPublicKey(keyPair.getPublic());  
   cert.setNotBefore(<date>);  
   cert.setNotAfter(<date>);  
   cert.setSignatureAlgorithm("SHA1WithRSAEncryption");   
    PrivateKey signingKey = keyPair.getPrivate();    
   return cert.generate(signingKey, "BC");  
}

2
你需要使用 X509V3CertificateGenerator 来创建一个证书,然后将该证书作为参数传递给密钥库,作为私钥条目的一部分。http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation - Cratylus
这个作业实际上是一个练习Java加密API的练习,使用JCA和JCE类。我们还没有讨论过那些证书,但在这个练习中,我们被要求将我们生成的私钥存储在受密码保护的KeyStore中。所以我会很高兴接受进一步的帮助,请 :) - MichBoy
非常感谢@Cratylus!! 尽管所有的设置器似乎都不存在。 - MichBoy
2
@Cratylus 你说 KeyPair keyPair = ...;//You already have this . 我没有它!我想要它!我在哪里可以得到它? - Tomáš Zato
7
这是一个很好的解决方案。然而,我不能使用Bouncy Castle,只能使用标准的Java 8 JCE库。该怎么办? - Andy
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接