2009-08-24 13 views
25

Próbuję pobrać klucz z KeyStore. utworzonego kluczy poprzez keytool:Nie można pobrać klucza z KeyStore

keytool -genkeypair -Dnazwa "cn = Mark Jones, ou = JavaSoft, O = słońce, c = US" -alias business2 -keypass abcdtest -keystore C: \ roboczy \ XMLSample \ magazynów kluczy \ mykeystore.jks -storepass 123456

oraz dodaje się następujące 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()); 
     } 
    } 
} 

biegnę na Java 1.6

Ale mam błąd:

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) 

Odpowiedz

18

to w zasadzie oznacza 2 rzeczy,

  1. Miałeś złe hasło.
  2. Twój magazyn kluczy jest w jakiś sposób uszkodzony.

Podejrzewam, że to # 1. Dokładnie sprawdź swoje hasło. Spróbuj, jeśli możesz podać klucz w keytole z tym samym hasłem.

+0

Mam ten sam problem. Podaję hasło do magazynu kluczy, ale jest napisane: "pozycje zaufanych certyfikatów nie są chronione hasłem". Jeśli nie podałem hasła, jest napisane: "java.security.KeyStore $ TrustedCertificateEntry niekompatybilny z java.security.KeyStore $ PrivateKeyEntry" –

+0

Hi Coder, Mam problem wymieniony w poniższym linku. Uprzejmie proszę podać mi rozwiązanie. http://stackoverflow.com/questions/33369965/trusted-certificate-entries-are-not-password-protected-java – praneeth

9

W linii ks.getEntry podajesz hasło sklepu. Powinien być zamiast tego kluczowym hasłem. Zastąp linię tym i zadziała:

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

Mam ten sam problem. Podaję hasło do magazynu kluczy, ale jest napisane: "pozycje zaufanych certyfikatów nie są chronione hasłem". Jeśli nie podałem hasła, jest napisane: "java.security.KeyStore $ TrustedCertificateEntry niekompatybilny z java.security.KeyStore $ PrivateKeyEntry" –

22

Przebiegłem przez podobny problem. Przyczyną problemu było to, że użyłem innego hasła dla klucza niż całego magazynu kluczy. Kod jest podobny do tego w artykule JSSE. Wygląda to tak:

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

Używam przepustki magazynu kluczy w pierwszym wierszu i klucza w ostatnim.

+0

Możesz również zmienić hasło dla klucza http://stackoverflow.com/a/2889605/ 2685402 – Wojtek

Powiązane problemy