web-dev-qa-db-ja.com

原因:Java.security.UnrecoverableKeyException:キーを回復できません

ABCC_client.storeという名前のjksキーストアが提供されています。このキーストアをcacertsにインポートして接続しようとすると、「No such Algorithm」エラーが表示されます。 PFAスタックトレース

    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

しかし、このキーストアを個別に使用すると、つまりcacertsに追加せずに機能します。

いくつかのグーグルは私を http://joewlarson.com/blog/2009/03/25/Java-ssl-use-the-same-password-for-keystore-and-key/ に導きましたキーとキーストアでパスワードが異なる場合があると述べています。

76

Tomcat 6以前を使用している場合は、キーストアパスワードとキーパスワードが同じであることを確認してください。 Tomcat 7以降を使用している場合は、それらが同じであること、またはキーパスワードがserver.xmlファイルで指定されていることを確認してください。

102
user805125

App/configで定義された秘密キーのパスワードが正しくありません。最初に、次のように別のパスワードに変更して、秘密キーのパスワードを確認してください。

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

上記の例は、パスワードをpasswordからchangeitに変更します。秘密鍵のパスワードがpasswordの場合、このコマンドは成功します。

66

Cannot recover key例外を持たないために、アプリケーションを実行していたJavaのインストールにJava Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Filesを適用する必要がありました。これらのファイルのバージョン8は here で見つけることができます。または、最新バージョンは このページ にリストされています。ダウンロードには、ポリシーファイルの適用方法を説明するファイルが含まれています。


JDK 8u151 なので、ポリシーファイルを追加する必要はありません。代わりに、JCE管轄ポリシーファイルは、crypto.policyというセキュリティプロパティによって制御されます。これをunlimitedに設定すると、JDKで無制限の暗号化を使用できます。リリースノートは上記の状態にリンクされているため、 Security.setProperty() またはJava.securityファイルで設定できます。 Java.securityファイルは、プログラムに詳細な here として起動するコマンドに-Djava.security.properties=my_security.propertiesを追加することによって追加することもできます。


JDK 8u161 無制限の暗号化がデフォルトで有効になっているため。

7
WhiteKnight

64ビットOpenSSLバージョンを使用してビルドされたキーストアにキーをインポートしたときに、同じエラーが発生しました。同じ手順に従って、32ビットOpenSSLバージョンを使用してビルドされたキーストアにキーをインポートすると、すべてがうまくいきました。

5
Heimi