Подтвердить что ты не робот

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

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: Экспорт файлa > Экспорт > Экспорт приложений для Android.
  • До JDK7: jarsigner -verbose -keystore КЛЮЧЕВЫЕ ФАЙЛЫ ALIAS.
  • С JDK7: jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore КЛЮЧЕВЫЕ ФАЙЛЫ ALIAS.

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

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

Рекомендации пользователя:

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

Резюме

  • Keystores не изменились,
  • У меня есть пароли к хранилищам ключей,
  • Недавно я успешно экспортировал приложение, используя:
    • Eclipse 3.8 (и Eclipse 4.0 +),
    • Последняя версия Java 7,
    • Последний плагин ADT.
  • Мой последний успешный экспорт и сборка была несколько недель назад с использованием Eclipse 3.8, новейших инструментов Android и Java 7 с тем же паролем.

Обновление (6/29/14)

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

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

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

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

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


Решение (6/29/14):

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

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

Команда будет меняться каждый раз:

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

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

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

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

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?

Неправильная проблема с Keystore?

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

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

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

Я потерял пароль для файла Keystore для Android

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Я предлагаю пару больше тепла и испытаний.

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

Шаги:

  • Отключить сборку автоматически (Project- > Build Automatically) в eclipse и очистить ваш проект.
  • Создайте его снова. (Щелкните правой кнопкой мыши проект + Build Project)
  • Экспорт проекта.
  • Выберите "Экспорт Android" (автоматически выровненный для вас)
  • Выберите свой ключ. укажите пароль. в списке должен появиться псевдоним (убедитесь в блокировке колпачков). Иногда мы даем правильный пароль, но из-за шапок он всегда терпит неудачу;)
  • Сообщите мне, если это сработает для вас.

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

Ответ 4

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

Решение

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

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

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

Ответ 5

Сохраняете ли вы такие значения, как key.store.password или key.alias.password в файле local.properties? Являются ли они неправильными?

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

Ответ 6

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

Скорее всего, если у вас, как и я, есть несколько версий 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

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

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

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

Ответ 7

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

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

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

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

keytool -keypasswd -keystore new.keystore -alias importantalias

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