No se puede obtener la clave de KeyStore

Intento obtener la clave de KeyStore. Creé un almacén de claves por Keytool:

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

Y el 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());
        }
    }
}

Corro en Java 1.6

Pero tiene 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 1

Esto básicamente significa 2 cosas,

  1. Tenías una contraseña incorrecta.
  2. Su almacén de claves está dañado de alguna manera.

Sospecho que es el # 1. Verifica tu contraseña. Pruebe si puede incluir la clave en keytool con la misma contraseña.

Respuesta: 2

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

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

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

Respuesta: 3

Necesito mostrar una casilla de verificación o un botón de radio marcado o desmarcado en función de un valor booleano. ¿Hay alguna manera de hacerlo en las páginas jsp? Estoy usando spring mvc 3. Es como las opciones marcadas / no marcadas en un ...

Obtuve el estilo java de Google desde aquí: https://github.com/google/styleguide/blob/gh-pages/eclipse-java-google-style.xml Parece que este estilo usa sangría de 2 espacios. Pero quiero 4 espacios ...

No puedo obtener mis mensajes en messages.properties para usarlos durante la validación de Spring de mis objetos de respaldo de formularios. app-config.xml: <bean id = "messageSource" class = "org.springframework.context.support ...

Entonces, creé un nuevo proyecto gradle, eligiendo Java como "bibliotecas y marcos adicionales". Gradle compilará a. \ Build \ classes y mantendrá la estructura del paquete, pero la "ruta de salida de compilación del módulo" ...