web-dev-qa-db-fra.com

Impossible d'obtenir la clé de KeyStore

J'essaye d'obtenir la clé de KeyStore. J'ai créé un keystore par 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

Et ce qui suit est 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());
        }
    }
}

Je cours sur Java 1.6

Mais ayez une erreur:

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)
26
MartinJoo

Cela signifie essentiellement 2 choses,

  1. Vous aviez un mauvais mot de passe.
  2. Votre magasin de clés est en quelque sorte corrompu.

Je soupçonne que c'est # 1. Vérifiez votre mot de passe. Essayez si vous pouvez répertorier la clé dans keytool avec le même mot de passe.

19
ZZ Coder

J'ai couru à travers le même problème. La racine du problème était que j'ai utilisé un mot de passe différent pour la clé que pour l'ensemble du magasin de clés. Le code est similaire à celui de l'article JSSE. Cela ressemble à ceci:

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

J'utilise le passe de magasin de clés dans la première ligne et le passe de clé dans la dernière.

24
VagabondEx

Dans la ligne ks.getEntry, vous lui donnez le mot de passe du magasin. Doit être le mot de passe clé à la place. Remplacez la ligne par ceci et cela fonctionnera:

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