96 votes

Causé par : java.security.UnrecoverableKeyException : Impossible de récupérer la clé

Je dispose d'un keystore jks nommé ABCC_client.store. Lorsque j'importe ce keystore dans cacerts et que j'essaie de me connecter, le message No such Algorithm error apparaît. PFA le stacktrace

    Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class:   com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
    at java.security.Provider$Service.newInstance(Provider.java:1245)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:220)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:147)
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
    at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
    at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102)
    at org.apache.axis.components.net.JSSESocketFactory.initFactory(JSSESocketFactory.java:61)
    at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:79)
    ... 32 more
Caused by: 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.KeyStore.getKey(KeyStore.java:763)
    at com.sun.net.ssl.internal.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:113)
    at com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:48)
    at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:239)
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:170)
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:40)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at java.security.Provider$Service.newInstance(Provider.java:1221)
    ... 39 more

Mais si j'utilise ce keystore indépendamment, c'est-à-dire sans l'ajouter à cacerts, il fonctionne.

Quelques recherches sur Google m'ont conduit à http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/ qui dit que le mot de passe peut être différent pour la clé et le keystore.

123voto

Si vous utilisez Tomcat 6 et antérieur, assurez-vous que le mot de passe du keystore et le mot de passe de la clé sont identiques. Si vous utilisez Tomcat 7 et les versions ultérieures, assurez-vous qu'ils sont identiques ou que le mot de passe de la clé est spécifié dans le champ server.xml fichier.

77voto

Umesh Rajbhandari Points 349

Le mot de passe de la clé privée défini dans votre app/config est incorrect. Essayez d'abord de vérifier le mot de passe de la clé privée en le remplaçant par un autre, comme suit :

keytool -keypasswd -new changeit -keystore cacerts -storepass changeit -alias someapp -keypass password

L'exemple ci-dessus change le mot de passe de password à changeit. Cette commande réussira si le mot de passe de la clé privée était password.

10voto

WhiteKnight Points 1256

Afin de ne pas avoir le Cannot recover key exception, j'ai dû appliquer les fichiers de politique de juridiction de force illimitée de Java Cryptography Extension (JCE) à l'installation de Java qui exécutait mon application. La version 8 de ces fichiers peut être trouvée ici ou la dernière version doit être répertoriée sur cette page . Le téléchargement comprend un fichier qui explique comment appliquer les fichiers de politique.


Depuis JDK 8u151 il n'est pas nécessaire d'ajouter des fichiers de politique. Au lieu de cela, les fichiers de stratégie de la juridiction JCE sont contrôlés par une propriété Security appelée crypto.policy . En réglant cela sur unlimited avec la possibilité d'utiliser une cryptographie illimitée pour le JDK. Comme le précisent les notes de mise à jour ci-dessus, elle peut être définie par Security.setProperty() ou via le java.security fichier. Le site java.security peut également être ajouté en ajoutant -Djava.security.properties=my_security.properties à la commande pour lancer le programme comme détaillé ici .


Depuis JDK 8u161 La cryptographie illimitée est activée par défaut.

5voto

Heimi Points 51

J'ai eu la même erreur lorsque nous avons importé une clé dans un keystore qui a été construit en utilisant une version 64bit d'OpenSSL. Lorsque nous avons suivi la même procédure pour importer la clé dans un keystore construit avec une version 32 bits d'OpenSSL, tout s'est bien passé.

3voto

Robin Mathur Points 21

Vérifiez si le mot de passe que vous utilisez est correct en exécutant la commande suivante

keytool -keypasswd -new temp123 -keystore awsdemo-keystore.jks -storepass temp123 -alias movie-service -keypass changeit

Si vous obtenez l'erreur suivante, votre mot de passe est erroné.

keytool error: java.security.UnrecoverableKeyException: Cannot recover key

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X