Хранилище ключей Android перестало работать

Совсем недавно у меня возникла проблема с хранилищем ключей. Я знаю, что по этой проблеме уже есть много вопросов. Я прочитал их все и яростно гуглил.

Ошибка:

keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
java.io.IOException: Keystore was tampered with, or password was incorrect
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
    at java.security.KeyStore.load(KeyStore.java:1214)
    at sun.security.tools.KeyTool.doCommands(KeyTool.java:885)
    at sun.security.tools.KeyTool.run(KeyTool.java:340)
    at sun.security.tools.KeyTool.main(KeyTool.java:333)
Caused by: java.security.UnrecoverableKeyException: Password verification failed
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770)
    ... 5 more

Программное обеспечение, которое я использую:

Ява

java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

Затмение

Version: 3.8.0
Build id: I20120502-2000

Последний плагин ADT

Последний Android SDK

Вот что я знаю:

  • Я не терял пароль и никогда не менял.
  • Я не могу восстановить пароль (я знаю пропуск).
  • Я не могу подписать существующее приложение другим ключом, не выпуская совершенно новое приложение (поэтому я не могу публиковать обновления).

Вот что я сделал:

  • Я много раз удалял и переустанавливал Eclipse.
  • Я удалил и переустановил плагин Android ADT.
  • Я удалял и повторно скачивал последний Android SDK много раз.
  • Я удалил и переустановил JDK7.
  • Я пробовал использовать резервные копии своего хранилища ключей.
  • Я проверил контрольные суммы MD5 с помощью «md5sum KEYSTORE» и сравнил их с резервными копиями (тот же результат MD5 - без подделок).
  • Я пробовал подобрать хранилище ключей (я получил пароль, который знал).
  • Я создал тестовый ключ (с текущими настройками) и проверил пароль, и, похоже, он работал нормально (так что что-то изменилось).
  • Я попытался вручную экспортировать android .apk, а затем попытался подписать его (вне Eclipse).

Вот как я экспортирую подписанное приложение:

  • Через Eclipse: экспорт с помощью "Файл"> "Экспорт"> "Экспорт приложения Android".
  • До JDK7: jarsigner -verbose -keystore KEYSTORE ФАЙЛОВ НИКНЕЙМЫ.
  • С JDK7: jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore KEYSTORE FILE ALIAS.

Что еще предстоит выяснить или попробовать?

  • В некоторых ссылках / URL-адресах говорится, что нужно удалить файл "trust.certs"?
  • Попробуйте удалить "debug.keystore"?
  • Повлияет ли обновление Eclipse или любого из инструментов разработки Android на мое хранилище ключей?
  • Не вызовет ли обновление Java с jdk6 до jdk7 какие-либо проблемы?
  • Могло ли это повлиять или изменить работу jarsigner'а?

Предложения пользователей:

  • Попробуйте использовать JDK6, но недавно мне удалось экспортировать приложение.
  • Проверено key.store.password или key.alias.password в моих local.properties
  • Автоматическое снятие флажка сборки в eclipse и очистка вашего проекта
  • Попробуйте удалить папку .metadata в своей рабочей области и очистить все временные папки.

Резюме

  • Хранилища ключей не менялись,
  • У меня есть пароли к хранилищам ключей,
  • I have successfully exported an application recently using:
    • Eclipse 3.8 (and Eclipse 4.0+),
    • Последняя версия Java 7,
    • Последний плагин ADT.
  • Мой последний успешный экспорт и сборка были несколько недель назад с использованием Eclipse 3.8, последних инструментов Android и Java 7 с тем же паролем.

Обновление (29.06.14)

  • Я использовал: keytool -list -keystore KEYSTORE, чтобы успешно доказать и показать, что 3 из моих 4 ключей работают.
  • Я взломал последний ключ и получил пароль из хранилища ключей (проход, который я уже знал), но пароль не работает, когда я вхожу для подписи. Я использовал: java -jar AndroidKeystoreBrute_v1.02.jar -m 3 -k KEYSTORE -d WORDLIST.
  • Как ни странно, иногда, когда я очень быстро набираю свой пароль в eclipse, появляется мой псевдоним, и я могу успешно экспортировать свое приложение. (Я знаю, что это безумие).
  • Обновленная версия Java.

Если я ввожу пароль очень быстро, иногда это срабатывает.

Кажется, что открытие Eclipse и первый ввод пароля позволяет мне использовать хранилище ключей.

Очевидно, если все остальное не поможет, мне придется создать новое хранилище ключей. Я действительно хотел бы решить эту проблему, я просто не уверен, что теперь делать, кроме повторной публикации с новым ключом.

Если ключ не может быть восстановлен должным образом, я могу открыть его исходный код на Github.


Решение (29.06.14):

Особая благодарность пользователю Erhannis!

Вот что я сделал:

Команда каждый раз выдавала мне ошибку:

keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v

Поскольку вы сказали мне, что мы можем извлекать закрытые ключи из хранилища ключей Java (.jks), я копал глубже и в итоге использовал вариант команды. Я перешел по ссылкам, которые вы разместили здесь и здесь:

keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -deststoretype pkcs12

После извлечения закрытого ключа и сохранения как PKCS12 я думаю, что извлек свой закрытый ключ и поместил его обратно в новое хранилище ключей Java:

keytool -importkeystore -srckeystore new.keystore -srcstoretype pkcs12 -destkeystore final.keystore -deststoretype jks

Использованная литература:

http://developer.android.com/tools/publishing/app-signing.html#signapp

http://code.google.com/p/android-keystore-password-recover/

Список URL-адресов StackOverflow, которые я прочитал:

Как справиться с утерянным паролем KeyStore в Android?

Недопустимая проблема с хранилищем ключей?

Android: я потерял хранилище ключей Android, что что мне делать?

Я потерял свой файл .keystore?

Забыли пароль хранилища ключей, думая о Brute- Обнаружение силы. это повредит хранилище ключей?

Я потерял пароль для файла хранилища ключей Android

Проблема с запуском моего подписанного хранилища ключей выпуска в Eclipse

Android - Забыли пароль к хранилищу ключей. Могу ли я расшифровать файл хранилища ключей?

Проблема с хранилищем ключей версии Android: хранилище ключей было подделано с, или пароль неверный


person Community    schedule 23.11.2012    source источник
comment
Возможно ли, что ваш файл хранилища ключей каким-то образом был поврежден? Будет ли это работать, если вы попытаетесь использовать резервную копию файла хранилища ключей, который был сохранен в другом месте (если он у вас есть)?   -  person jcw    schedule 01.01.2013
comment
Я ответил на это. Я проверил MD5 в резервных копиях, а также в текущих, чтобы убедиться, совпадают ли они. Я также пробовал использовать резервные копии, но безрезультатно.   -  person Jared Burrows    schedule 01.01.2013
comment
Я хранил его локально, но всегда храню резервные копии.   -  person Jared Burrows    schedule 31.07.2013
comment
Думаю, у меня может быть такая же проблема. Как вы думаете, может ли это быть этой проблемой?   -  person Erhannis    schedule 02.08.2013
comment
Вроде очень похоже. Все началось, когда я недавно обновился. Это затронуло только одно приложение.   -  person Jared Burrows    schedule 02.08.2013
comment
Я получил эту ошибку: введите ключевой пароль для ошибки keytool ‹harmankaya›: java.security.UnrecoverableKeyException: невозможно восстановить ключ   -  person Erhan H.    schedule 25.03.2016


Ответы (8)


Возможно, у меня была такая же проблема. Я так и не понял, почему это не удалось (хотя мне интересно, было ли это из-за того, что пароль хранилища ключей был короче 6 цифр), но я смог скопировать свой ключ в новое хранилище ключей, которое затем переименовал, чтобы заменить старый, и после этого он загадочным образом сработал (с новыми паролями). Кстати, нужен был ключевой пароль. Отработав https://security.stackexchange.com/a/3795, я сделал следующее:

  1. keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
  2. Дважды ввел новый пароль хранилища ключей
  3. Нажмите Enter, когда он попросит меня ввести пароль исходного хранилища ключей (оставьте поле пустым)
  4. Ввели ключевой пароль

Перепроверив, что новый работает, я просто скопировал его поверх старого. Надеюсь, это сработает для вас; удачи.

person Community    schedule 02.08.2013
comment
Я немного сбит с толку, почему он пометил мой пост как вики сообщества. Изменить: О, подождите, я понял. Сам вопрос отмечен как вики сообщества. - person Erhannis; 02.08.2013
comment
по какой-то причине я только сейчас это вижу, скоро попробую и свяжусь с вами! - person Jared Burrows; 26.12.2013
comment
Извините за долгое ожидание. Я пробовал это, но всегда получаю одну и ту же ошибку каждый раз, когда пытаюсь ввести пароль. - person Jared Burrows; 15.02.2014
comment
@JaredBurrows Выдает ли вам ошибку, когда вы пытаетесь скопировать ключ в новое хранилище ключей или когда вы пытались использовать новое хранилище ключей? - person Erhannis; 18.02.2014
comment
Да, всегда жалуется на пароль. Однако когда я использую инструмент грубой силы, я получаю пароль. Инструмент может войти в систему / проверить правильный пароль. - person Jared Burrows; 18.02.2014
comment
@JaredBurrows Э, извини; ЧТО жалуется на пароль? keytool -importkeystore, или при попытке использовать скопированное хранилище ключей? Кроме того, когда вы говорите, что инструмент может войти / проверить правильный пароль, вы имеете в виду, что ваша проблема решена, или просто инструмент грубой силы подтверждает, что у вас правильный пароль, даже если keytool говорит, что это не так. ? - person Erhannis; 18.02.2014
comment
Недавно я попробовал это снова. Он жалуется, что, когда я оставляю пароль пустым, пароль хранилища ключей слишком короткий - должен содержать не менее 6 символов. Инструмент грубой силы подтверждает мой пароль. - person Jared Burrows; 30.06.2014
comment
Я получаю java.security.UnrecoverableKeyException: Cannot recover key - person Gustav; 27.03.2015
comment
Введите пароль ключа для ‹myalias› ошибки keytool: java.security.UnrecoverableKeyException: невозможно восстановить ключ java.security.UnrecoverableKeyException: невозможно восстановить ключ в sun.security.provider.KeyProtector.recover (KeyProtector.java:328) - person Erhan H.; 25.03.2016
comment
Прошло много времени с тех пор, как я думал об этом, но единственное, что, возможно, имеет отношение к делу, что здесь не написано, это то, что в какой-то момент после того, как все это произошло, мы загрузили, сохранили и использовали предыдущую версию jar были задействованы инструменты подписи, потому что новые перестали работать. Это все, что у меня есть. - person Erhannis; 26.03.2016

У меня была та же проблема, и я пробовал все, что предлагается в этой ветке, но ничто не смогло сохранить мой пароль псевдонима. Дело в том, что я был абсолютно уверен насчет пароля, поскольку уже четыре раза обновлял приложение. Я получал сообщение «Было взломано хранилище ключей или неверный пароль».

Решение

Похоже, что при создании хранилища ключей с помощью eclipse перед паролем был добавлен пробел!

Эта неприятная ошибка, по-видимому, была исправлена ​​в более поздней версии, из-за которой я не мог подписать свое приложение с паролем, который я считал правильным.

На основе этой ссылки SO: Ant не может построить подписанный apk после обновления до android v20. Я бы посоветовал вам попробовать добавить пробел до или после пароля.

person Community    schedule 04.09.2014
comment
У меня была такая же проблема с Unity - в моем случае 2 пробела. Будьте осторожны при использовании копирования / вставки! Зря потратил 4 часа своего времени. :( - person adamgede; 05.10.2018

Попробуйте удалить папку .metadata в своей рабочей области и очистить все временные папки. Если ваш файл хранилища ключей не поврежден и вы пытались правильно переустановить Eclipse, ADT, Android SDK и Java SDK, я не вижу других возможных причин этой странной проблемы, за исключением файлов кэша .metadata и \ или некоторого временного повреждения.

Другое предложение

Попробуйте использовать утилиту Portecle для управления и проверки хранилищ ключей, ключей, сертификатов, запросов сертификатов, списков отзыва сертификатов и т. Д.

person Silverstorm    schedule 29.12.2012
comment
Хорошо, я переместил папку .metadata вместо того, чтобы удалять ее. Какие еще временные папки? - person Jared Burrows; 30.12.2012
comment
@JaredBurrows с другими временными папками Я имею в виду стандартный временный каталог вашей ОС, файл, созданный в этом каталоге во время экспорта, обычно восстанавливается каждый раз, когда вы экспортируете проект ... однако, если вы получаете эту странную проблему, это еще одно испытание для делать - person Silverstorm; 30.12.2012
comment
Я отредактировал свой ответ, добавив еще одно предложение. Надеюсь это поможет - person Silverstorm; 30.12.2012
comment
Хорошо, у меня наконец-то появилось время стереть мой .eclipse и мою папку .metadata. Я переустановил плагин ADT и импортировал проект, который мне нужно было экспортировать. По какой-то причине у меня все еще проблемы. - person Jared Burrows; 23.01.2013

Предлагаю еще пару разогревов и проб.

Имейте терпение, чтобы применить эти,

Шаги:

  1. Снимите флажок сборки автоматически (Project-> Build Automatically) в eclipse и очистите свой проект.
  2. Создайте его снова. (Щелкните правой кнопкой мыши на проекте + Build Project).
  3. Экспортный проект.
  4. Выберите Android Export. (Автоматически выравнивается для вас).
  5. Выбери свой ключ. укажите пароль. в списке должен появиться псевдоним (убедитесь, что используется Caps Lock). Иногда мы даем правильный пароль, но из-за заглавных букв он всегда не работает;)
  6. Дайте мне знать, если это сработает для вас.

Надеюсь, это поможет вам.

person Ajay Kumar Meher    schedule 27.12.2012
comment
Хорошо, я пробовал это, но это все еще не работает. Однако, спасибо. - person Jared Burrows; 29.12.2012

Вы храните такие значения, как key.store.password или key.alias.password в вашем файле local.properties? Что-то из этого неверно?

Мне любопытно, возникает ли какая-то ошибка для ключей, созданных с помощью JDK6 и проверенных в JDK7 - это объясняет, почему новые ключи, которые вы создали для тестирования, работают, а старый - нет. Попробуйте перейти на JDK6 и посмотрите, исправит ли это это. У других были проблемы с jarsigner в JDK7, которые исчезли, когда они понизили версию до 6. Если это сработает, отправьте отчет об ошибке и потребуйте патч, чтобы вы могли безопасно перейти на Java 7 :)

person Alexander Lucas    schedule 10.12.2012
comment
Извините, что вернулся к вам так поздно, но как я мог случайно сохранить эти значения в local.properties? Кроме того, вы имеете в виду project.properties, а не local.properties? - person Jared Burrows; 21.12.2012
comment
Значения будут прочитаны в любом из них. local.properties предназначен для хранения значений, специфичных для вашего компьютера, которые не будут входить в систему управления версиями (например, путь к SDK, путь к файлам хранилища ключей и т. д.). Свойства проекта предназначены для пар ключ / значение, которые не зависят от машины, например, минимальная / целевая версия API. - person Alexander Lucas; 27.12.2012
comment
Я посмотрел и не нашел этих файлов на моем локальном компьютере. - person Jared Burrows; 28.12.2012

Я недавно боролся с этой проблемой и попробовал все предложения, перечисленные здесь и в других местах. Наконец, я обнаружил глупую ошибку, которая вызвала эту ошибку с моей стороны - я хотел поделиться ею здесь на случай, если это поможет кому-либо из вас.

Это более вероятно, если у вас, как и у меня, есть несколько версий Java на вашем компьютере и вы обновили JRE / JDK с момента первоначального создания хранилища ключей до момента, когда вы пытаетесь подписать APK.

По какой-то причине наши инструкции по компиляции ссылались на полный путь Java следующим образом:

C: \ Progra ~ 1 \ Java \ jdk1.6.0_45 \ bin \ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore cre80ve.keystore unsigned.apk cre80ve

Одно из приведенных выше предложений заставило меня подумать, что это может быть вовсе не проблема с паролем, а может быть несовместимость версий, вызывающая проблему. Итак, я выполнил следующую команду:

keytool -list -keystore cre80ve.keystore

Используя пароль, который я знал, был правильным, и вот, он подтвердил, что это правильный пароль.

Затем я удалил явную ссылку в пути к (более старой) версии Java. Это заставило его автоматически выбрать последнюю версию Java (в моем случае jdk1.8.0_31):

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore cre80ve.keystore unsigned.apk cre80ve

И все заработало нормально!

Итог: это может быть вовсе не проблема с паролем, а разные версии Java или Android SDK, вызывающие проблему, поэтому не забудьте проверить это.

И как только он начнет работать, не забудьте сделать резервную копию хранилища ключей и пароля в надежном месте :-)

person Community    schedule 07.08.2015
comment
Спасибо за это: This is more likely to be the case if you, like me, have multiple Java versions on your machine and had upgraded JRE / JDK between the time you originally created the keystore and now when you're trying to sign the APK. Думаю, вот что со мной случилось. - person Jared Burrows; 07.08.2015

Мой ключевой псевдоним внезапно перестал работать. (Хорошо, после нескольких обновлений Android Studio и Java).

Я пробовал все решения из этой ветки, а также из других. В моем случае решение было неожиданным. У меня есть хранилище ключей с несколькими псевдонимами. Ни один из них не работал, кроме одного, у которого был пароль такой же, как у хранилища ключей. Но, к сожалению, это было не то, что мне было нужно. Это заставило меня думать без логики. Я скопировал единственный псевдоним в новое хранилище ключей с помощью

keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -srcalias importantalias

А затем я изменил пароль псевдонима на тот же, что и пароль хранилища ключей:

keytool -keypasswd -keystore new.keystore -alias importantalias

Наконец-то я смог подписать свой apk. Похоже на глупую ошибку, которая может потратить день на разработку.

person Community    schedule 08.11.2015
comment
Это тот же ответ из правильного ответа в этой ветке. - person Jared Burrows; 09.11.2015
comment
Я пробовал, но получаю ошибку, ошибка keytool: java.security.UnrecoverableKeyException: не удается восстановить ключ - person Erhan H.; 25.03.2016

Просто возникла эта проблема - внезапно Android Studio забыла мои пароли и не использовала те, которые у меня были в файле gradle. У меня были одни и те же ключевой файл и пароли в одном проекте уже 6 лет!

Поэтому я ввел их вручную - но раз за разом не удавалось проверить. Я пробовал такие вещи, как аннулирование кешей, перезапуск Android Studio и восстановление резервной копии хранилища ключей, но ничего не помогло.

Наконец в полном отчаянии я попытался сменить пароль хранилища ключей и пароль ключа. О чудо - заработало! Оказывается, я поменял пароли, когда ввел их в файл сборки Gradle несколько лет назад, и по какой-то причине я этого не заметил.

Вывод: никогда не будьте на 100% уверены, что делаете все правильно.

person Community    schedule 26.05.2018