2009-08-24 29 views
25

Tôi cố lấy Key từ KeyStore. Tôi đã tạo kho khóa bằng Keytool:Không thể lấy khóa từ KeyStore

keytool -genkeypair -dname "cn = Mark Jones, ou = JavaSoft, o = Sun, c = US" -alias business2 -keypass abcdtest -keystore C: \ workspace \ XMLSample \ keystore \ mykeystore.jks -storepass 123456

Và sau đây là GenerateXML.java

import java.io.FileInputStream; 
import java.security.KeyStore; 
import java.security.cert.X509Certificate; 
import javax.xml.crypto.dsig.XMLSignContext; 
import javax.xml.crypto.dsig.XMLSignatureFactory; 
import javax.xml.crypto.dsig.dom.DOMSignContext; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 

public class GenerateXML { 

    public static void main(String[] args) throws Exception { 

     try { 
      char[] passwd = "123456".toCharArray(); 

      //Load the KeyStore and get the signing key and certificate 
      KeyStore ks = KeyStore.getInstance("JKS"); 
      ks.load(new FileInputStream("C:\\workspace\\XMLSample\\keystore\\mykeystore.jks"), passwd); 
      KeyStore.PrivateKeyEntry keyEnt = (KeyStore.PrivateKeyEntry)ks.getEntry("business2", new KeyStore.PasswordProtection(passwd)); // -> ERROR IN THIS ROW 

      X509Certificate cert = (X509Certificate)keyEnt.getCertificate(); 

      //Create a DOMSignContext 
      XMLSignContext context = new DOMSignContext(keyEnt.getPrivateKey(), doc.getDocumentElement()) ; 

      //Create a DOM XMLSignatureFactory 
      XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); 

     } catch(Exception e) { 
      e.printStackTrace(); 
      throw new Exception(e.toString()); 
     } 
    } 
} 

tôi chạy trên Java 1.6

Nhưng có lỗi:

java.security.UnrecoverableKeyException: Cannot recover key 
at sun.security.provider.KeyProtector.recover(KeyProtector.java:311) 
at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:121) 
at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:38) 
at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:456) 
at java.security.KeyStore.getEntry(KeyStore.java:1261) 
at xml.generate.GenerateXML.main(GenerateXML.java:31) 

Trả lời

18

cơ bản Điều này có nghĩa 2 thứ,

  1. Bạn đã có một mật khẩu xấu.
  2. Kho khóa của bạn bị hỏng bằng cách nào đó.

Tôi cho rằng đó là số 1. Kiểm tra kỹ mật khẩu của bạn. Hãy thử nếu bạn có thể liệt kê khóa trong keytool bằng cùng một mật khẩu.

+0

Tôi gặp vấn đề tương tự. Tôi đang đưa mật khẩu kho khóa nhưng nó nói: "mục nhập chứng chỉ đáng tin cậy không được bảo vệ bằng mật khẩu". Nếu tôi không cung cấp mật khẩu, nó nói: "java.security.KeyStore $ TrustedCertificateEntry không tương thích với java.security.KeyStore $ PrivateKeyEntry" –

+0

Hi Coder, Tôi gặp vấn đề được đề cập trong liên kết bên dưới. Vui lòng cung cấp cho tôi một giải pháp. http://stackoverflow.com/questions/33369965/trusted-certificate-entries-are-not-password-protected-java – praneeth

9

Trong dòng ks.getEntry, bạn cung cấp cho nó mật khẩu cửa hàng. Nên thay thế mật khẩu khóa. Thay thế dòng này và nó sẽ hoạt động:

char[] keypwd = "abcdtest".toCharArray(); 
KeyStore.PrivateKeyEntry keyEnt = (KeyStore.PrivateKeyEntry) ks.getEntry("business2", new KeyStore.PasswordProtection(keypwd)); 
+0

Tôi gặp vấn đề tương tự. Tôi đang đưa mật khẩu kho khóa nhưng nó nói: "mục nhập chứng chỉ đáng tin cậy không được bảo vệ bằng mật khẩu". Nếu tôi không cung cấp mật khẩu, nó nói: "java.security.KeyStore $ TrustedCertificateEntry không tương thích với java.security.KeyStore $ PrivateKeyEntry" –

22

Tôi đã chạy qua các vấn đề tương tự. Gốc của vấn đề là tôi đã sử dụng mật khẩu khác cho khóa so với toàn bộ kho khóa. Mã này tương tự như mã trong bài viết JSSE. Có vẻ như sau:

serverKeyStore.load(new FileInputStream("resource/server.jks"), passphrase.toCharArray()); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
tmf.init(serverKeyStore); 
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
kmf.init(serverKeyStore, keyphrase.toCharArray()); 

Tôi sử dụng mã khóa chính trong dòng đầu tiên và mã khóa trong lần cuối cùng.

+0

Bạn cũng có thể thay đổi mật khẩu cho khóa http://stackoverflow.com/a/2889605/ 2685402 – Wojtek

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