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 был изменен или пароль был неверным"
Ответы
Ответ 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.
Это похоже на глупую ошибку, которая может растратить день разработки.