2012-12-15 26 views
12

Tôi cần lưu trữ 2 phím vào KeyStore Dưới đây là các mã có liên quan:java - làm thế nào để lưu trữ một chìa khóa trong 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(); 

Mặc dù tôi nhận được một execption "chìa khóa cá nhân phải được kèm theo chuỗi chứng chỉ"

Điều đó có nghĩa là gì? và tôi sẽ tạo ra nó như thế nào?

Trả lời

15

Bạn cũng cần phải cung cấp chứng chỉ (khóa công khai) cho mục nhập khóa cá nhân. Đối với chứng chỉ được ký bởi CA, chuỗi là chứng chỉ của CA và chứng chỉ kết thúc. Đối với một chứng chỉ tự ký bạn chỉ có tự ký giấy chứng nhận
Ví dụ:

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

Để tạo giấy chứng nhận theo này link:
Ví dụ:

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

khóa công khai là loại chính và họ yêu cầu Chứng chỉ []. Làm thế nào tôi sẽ đúc khóa công khai để chứng nhận chuỗi – MichBoy

+0

Bạn không có một 'X509Certificate'? Bạn đã nhận được khóa riêng tư ở đâu? – Cratylus

+0

Tôi đã khởi tạo KeyPairGenerator để tạo cặp khóa – MichBoy

Các vấn đề liên quan