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)
Cela signifie essentiellement 2 choses,
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.
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.
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));