2012-12-15 10 views
12

ho bisogno di memorizzare 2 chiavi in ​​KeyStore Ecco il codice rilevante:java - come memorizzare una chiave nel 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(); 

Anche se ottengo un execption "chiave privata deve essere accompagnata dalla catena di certificati"

Che cos'è, esattamente? e come lo genererei?

risposta

15

È necessario fornire anche il certificato (chiave pubblica) per l'immissione della chiave privata. Per un certificato firmato da una CA, la catena è il certificato della CA e il certificato finale. Per un certificato auto-firmato hai solo l'auto-firmato certificato
Esempio:

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

Per generare il certificato di seguire questo link:
Esempio:

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"); 
} 
+0

la chiave pubblica è di tipo chiave e richiedono il certificato []. Come faccio a trasmettere la chiave pubblica alla catena di certificati – MichBoy

+0

Non hai un 'X509Certificate'? Dove hai preso la chiave privata? – Cratylus

+0

Ho inizializzato un KeyPairGenerator per generare una coppia di chiavi – MichBoy

Problemi correlati