Викликано: java.security.UnrecoverableKeyException: Не вдається відновити ключ


84

Мені надається магазин ключів jks з назвою ABCC_client.store. Коли я імпортую цей магазин ключів до кацертів і намагаюся підключити його, повідомляється, що такої помилки алгоритму немає. 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

Але якщо я користуюся цим сховищем ключів самостійно, тобто, не додаючи його в кацерти, він працює.

Деякі гугління привели мене до http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/, де сказано, що пароль може бути іншим для ключ і магазин ключів.


Трохи коду, щоб побачити, що називається, якщо це можливо?
Бруно

я намагався викликати метод веб-служби всередині коду .. Код несправності AxisFault: { schemas.xmlsoap.org/soap/envelope } Server.userException errorSubcode: faultString: java.net.SocketException: java.security.NoSuchAlgorithmException: Помилка побудови реалізація (алгоритм: за замовчуванням, постачальник: SunJSSE, клас: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
Mrinal Бхаттачарджі

2
Тут може бути продубльовано подібне запитання із відповідачем.
microvett

Ні, моя проблема полягає в тому, що магазин ключів працює, якщо ми встановили системні властивості використовувати цей магазин ключів. Але якщо ми завантажимо цей магазин ключів у jvm за замовчуванням, тобто кацертує, це робить wrk. Там написано поганий сертифікат ..
Mrinal Bhattacharjee

Відповіді:


109

Якщо ви використовуєте Tomcat 6 та новіші версії, переконайтесь, що пароль сховища ключів і пароль ключа однакові. Якщо ви використовуєте Tomcat 7 і пізніші версії, переконайтеся, що вони однакові або що пароль ключа вказаний у server.xmlфайлі.


10
Це правда. Довідка tomcat.apache.org/tomcat-6.0-doc/…
Атхарва

2
Відповідна пропозиція: Нарешті, вам буде запропоновано ввести пароль ключа , який є паролем спеціально для цього Сертифіката (на відміну від будь-яких інших Сертифікатів, що зберігаються в тому ж файлі сховища ключів). Тут ПОВИНЕН використовувати той самий пароль, що і для самого пароля сховища ключів. Це обмеження реалізації Tomcat. (Наразі keytoolпідказка повідомить, що натискання клавіші ENTER робить це автоматично для вас.)
Капітан Мен

У мене виникла ця проблема з сховищем ключів Java JMeter (https) coz і паролі ключів були різними. Посилання stackoverflow.com/questions/2889238/… . змінити пароль ключа для вирішення проблеми. Велика допомога! Дякую.
Ріші

@CaptainMan, що правда лише в Tomcat6, з Tomcat7 - ні .
Андреа Лігіос 02.03.18

2
@AndreaLigios хороший момент, відповідна цитата: Нарешті, вам буде запропоновано ввести пароль ключа , який є паролем спеціально для цього Сертифіката (на відміну від будь-яких інших Сертифікатів, що зберігаються в тому ж файлі магазину ключів). keytoolПідказка покаже вам , що при натисканні клавіші ВВЕДЕННЯ автоматично використовує один і той же пароль для ключа в сховище ключів. Ви можете використовувати той самий пароль або вибрати власний. Якщо ви виберете інший пароль для пароля сховища ключів, вам також потрібно буде вказати власний пароль у server.xmlфайлі конфігурації.
Капітан Ман

73

Пароль приватного ключа, визначений у вашому додатку / конфігурі, неправильний. Спочатку спробуйте перевірити пароль приватного ключа, змінивши його на наступний:

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

Наведений вище приклад змінює пароль із пароля на його. Ця команда буде успішною, якщо паролем приватного ключа був пароль.


2
Хоча я не використовував цю відповідь стосовно запитання. Це було корисно для перевірки файлу сховища ключів, пароля магазину, псевдоніма / ключа та пароля ключа.
Рус

1
Пам'ятайте, що після виконання цієї команди ви зміните пароль сховища ключів. Вам доведеться встановити пароль назад до початкового.
gersonZaragocin

насправді, досить вказати просто -keypasswd -keystore storefile -alias somealiasта ввести все інше у підказці.
Андрій Регентов,

Під час запуску цього коду я отримую таку помилку - "keytool error: java.security.UnrecoverableKeyException: Cannot recover key"чи є спосіб перевірити, що є моїм паролем ключа псевдоніма, або змінити його, не знаючи старого?
Kavin Raju S

10

Щоб не мати Cannot recover keyвинятків, мені довелося застосувати файли політики необмеженої міцності юрисдикції Java Cryptography Extension (JCE) до інсталяції Java, на якій працював мій додаток. Версію 8 цих файлів можна знайти тут, або остання версія повинна бути вказана на цій сторінці . Завантажується файл, який пояснює, як застосувати файли політики.


З JDK 8u151 не потрібно додавати файли політики. Натомість файлами політики юрисдикції JCE керує властивість Security, що називається crypto.policy. Встановивши це unlimitedз, дозволить JDK використовувати необмежену криптографію. Як примітки до випуску, пов’язані з вищевказаним станом, його можна встановити файлом Security.setProperty()або за допомогою java.securityфайлу. java.securityФайл також може бути доданий до шляхом додавання -Djava.security.properties=my_security.propertiesдо команди , щоб запустити програму , як описано тут .


Оскільки JDK 8u161 необмежена криптографія ввімкнена за замовчуванням.


3
Я бачу цю помилку, незважаючи на те, що встановлені банки файлів політики.
Адам

@Adam Моє рішення призначене для конкретного випадку, який може відрізнятися від того, який ви відчуваєте. Однак я додав оновлення, щоб відобразити зміни, що відбулися в JDK 8u151.
WhiteKnight

5

У мене була та ж помилка, коли ми імпортували ключ у магазин ключів, який був побудований за допомогою 64-бітної версії OpenSSL. Коли ми дотримувались тієї самої процедури, щоб імпортувати ключ до магазину ключів, який був побудований за допомогою 32-розрядної версії OpenSSL, все пішло нормально.


3
Основною причиною помилки вище було java.security.UnrecoverableKeyException: Не вдається відновити ключ. Причиною цього може бути помилковий пароль, як згадувалося вище, а також побудова сховища ключів із 64-бітною реалізацією OpenSSL. Тому я вважаю свою відповідь ще одним можливим рішенням. Це допомогло мені в тій же ситуації помилки, тому я запропонував рішення тут.
Хеймі,

openssl не створює файли сховища ключів Java. Не могли б ви це пояснити?
aled

Думаю, ти відповіси. З тією ж проблемою я стикаюся при зверненні до веб-сервісів https з форми OpenESB 3.05. Я слідую вашим вказівкам і знову генерую файл jks із 32-бітною реалізацією OpenSS, і це чудово працює
Marti Pàmies Solà,

2

Перевірте правильність пароля, який ви використовуєте, запустивши команду нижче

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

Якщо ви отримуєте помилку нижче, то ваш пароль неправильний

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.