web-dev-qa-db-fra.com

java - comment stocker une clé dans le magasin de clés

J'ai besoin de stocker 2 clés dans KeyStore Voici le code correspondant:

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();

Bien que j'obtienne une exception "La clé privée doit être accompagnée d'une chaîne de certificats"

Qu'est-ce que c'est exactement? et comment pourrais-je le générer?

18
MichBoy

Vous devez également fournir le certificat (clé publique) pour l'entrée de clé privée. Pour un certificat signé par une autorité de certification, la chaîne est le certificat de l'autorité de certification et le certificat final. Pour un certificat auto-signé, vous ne disposez que du certificat auto-signé
Exemple:

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);  

Pour générer le certificat, suivez ceci lien :
Exemple:

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");  
}
17
Cratylus