web-dev-qa-db-fra.com

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

On me fournit un magasin de clés jks nommé ABCC_client.store. Lorsque j'importe ce fichier de clés dans cacerts et que je tente de le connecter, une erreur d'algorithme de ce type est signalée. 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 magasin de clés indépendamment, c'est-à-dire sans l'ajouter à cacerts, cela fonctionne.

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

77

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

103
user805125

Le mot de passe de clé privée défini dans votre application/config est incorrect. Commencez par 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 modifie le mot de passe mot de passe en mot de passe. Cette commande aboutira si le mot de passe de la clé privée était mot de passe.

66
Umesh Rajbhandari

Afin de ne pas avoir l'exception Cannot recover key, j'ai dû appliquer les fichiers de stratégie de juridiction Java Cryptography Extension (JCE) illimités à 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 listée sur cette page . Le téléchargement comprend un fichier qui explique comment appliquer les fichiers de stratégie.


Depuis JDK 8u151 , il n'est pas nécessaire d'ajouter des fichiers de règles. Au lieu de cela, les fichiers de règles de juridiction JCE sont contrôlés par une propriété de sécurité appelée crypto.policy. Définir ce paramètre sur unlimited avec permet au JDK d’utiliser une cryptographie illimitée. En tant que notes de publication liées à l’état ci-dessus, il peut être défini par Security.setProperty() ou via le fichier Java.security. Le fichier Java.security peut également être ajouté en ajoutant -Djava.security.properties=my_security.properties à la commande permettant de démarrer le programme de manière détaillée ici .


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

7
WhiteKnight

J'ai eu la même erreur lorsque nous avons importé une clé dans un magasin de clés créé à l'aide d'une version OpenSSL 64 bits. Lorsque nous avons suivi la même procédure pour importer la clé dans un magasin de clés créé à l'aide d'une version OpenSSL 32 bits, tout s'est bien passé.

5
Heimi