java - 如何在密钥库中存储密钥

Mic*_*Boy 17 java keystore

我需要将2个密钥存储到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();
Run Code Online (Sandbox Code Playgroud)

虽然我得到了一个execption"私钥必须伴随证书链"

那究竟是什么?我将如何生成它?

Cra*_*lus 17

您还需要提供私钥输入的证书(公钥).对于由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);  
Run Code Online (Sandbox Code Playgroud)

要生成证书,请点击此链接:
示例:

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");  
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案.但是,我不允许使用充气城堡,只有标准的Java 8 JCE库.该怎么办? (6认同)
  • 您需要使用`X509V3CertificateGenerator`来创建证书,您将作为参数传递给密钥库作为私钥输入的一部分http://www.bouncycastle.org/wiki/display/JA1/X.509+Public +按键+证书+和+认证+请求代 (2认同)
  • @Cratylus你说`KeyPair keyPair = ...;//你已经有了这个`。我没有!我要它!我在哪里可以得到它? (2认同)