Совсем недавно у меня была проблема с хранилищем ключей. Я знаю, что есть много вопросов об этой проблеме. Я читал их все и яростно гугл.
Ошибка:
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 для Android
Проблема с запуском моего подписанного хранилища ключей в Eclipse
Android - Забыл пароль хранилища ключей. Могу ли я дешифровать файл хранилища ключей?
Проблема с хранилищем ключей для Android: "Keystore был изменен или пароль был неверным"