2009-08-24 20 views
25

Intento obtener Key de KeyStore. he creado un almacén de claves por Keytool:No se puede obtener la clave de KeyStore

herramienta de claves -genkeypair -dNOMBRE "cn = Mark Jones, ou = JavaSoft, o = Sol, c = US" negocio2 -alias -keypass abcdtest -keystore C: \ workspace \ xmlsample \ mykeystore.jks \ almacén de claves -storepass 123456

Y lo siguiente es 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()); 
     } 
    } 
} 

que ejecutar en Java 1.6

Pero tener error:

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) 

Respuesta

18

Esto básicamente significa 2 cosas,

  1. usted tuvo una mala contraseña.
  2. Su almacén de claves está dañado de alguna manera.

Sospecho que es # 1. Verifica tu contraseña Intente si puede listar la clave en keytool con la misma contraseña.

+0

Estoy teniendo el mismo problema. Estoy dando la contraseña del almacén de claves, pero dice: "las entradas de certificados de confianza no están protegidas con contraseña". Si no le di la contraseña, dice: "java.security.KeyStore $ TrustedCertificateEntry incompatible con java.security.KeyStore $ PrivateKeyEntry" –

+0

Hola codificador, Tengo un problema mencionado en el siguiente enlace. Amablemente dame una solución. http://stackoverflow.com/questions/33369965/trusted-certificate-entries-are-not-password-protected-java – praneeth

9

En la línea ks.getEntry, le está dando la contraseña de la tienda. Debería ser la contraseña clave en su lugar. Reemplace la línea con esto y funcionará:

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

Estoy teniendo el mismo problema. Estoy dando la contraseña del almacén de claves, pero dice: "las entradas de certificados de confianza no están protegidas con contraseña". Si no le di la contraseña, dice: "java.security.KeyStore $ TrustedCertificateEntry incompatible con java.security.KeyStore $ PrivateKeyEntry" –

22

Me he encontrado con el problema similar. La raíz del problema fue que utilicé una contraseña diferente para la clave que para todo el almacén de claves. El código es similar al del artículo de JSSE. Se ve así:

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

Utilizo el pase de almacén de claves en la primera línea y el pase de la clave en el último.

+0

También puede cambiar la contraseña para la clave http://stackoverflow.com/a/2889605/ 2685402 – Wojtek

Cuestiones relacionadas