Apk должен быть подписан с теми же сертификатами, что и предыдущая версия

Я загрузил свое приложение в Google Play (когда он был назван Android Market) некоторое время назад.

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

Ошибка загрузки

Вы загрузили APK, который подписан другим сертификатом для ваших предыдущих APK. Вы должны использовать тот же сертификат.

Ваши существующие APK подписаны с сертификатом (-ами) с отпечатками пальцев:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
и сертификат (ы), используемый для подписания APK, который вы загрузили, имеет отпечатки пальцев:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

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

Что я могу сделать, чтобы подписать мое приложение с новым сертификатом?

Ответ 1

Ничего. Прочтите документацию: Публикация обновлений на Android Маркете

Перед загрузкой обновленного приложения убедитесь, что вы увеличили атрибуты android: versionCode и android: versionName в элементе файла манифеста. Кроме того, имя пакета должно быть одинаковым, а .apk должно быть подписано с тем же закрытым ключом. Если имя пакета и сертификат подписи не соответствуют требованиям существующей версии, Market рассмотрит это новое приложение и не будет предлагать его пользователям как обновление.

Ответ 2

Вы ошибочно подписали ключ отладки?

Google Play не позволяет публиковать приложение, подписанное с вашим хранилищем отладки. Если вы попытаетесь загрузить такой APK, Google Play завершится с сообщением "Вы загрузили APK, который был подписан в режиме отладки. Вам нужно подписать APK в режиме деблокирования".

Однако, если вы попытаетесь загрузить обновление, подписанное с хранилищем отладки, вы не увидите это сообщение; Google Play отобразит сообщение, указанное в вопросе, ссылаясь на отпечатки SHA1.

Итак, во-первых, проверьте, по ошибке ли вы подписали приложение с ключом отладки.


Как проверить, какие ключи подписки были использованы?

Соберите информацию из APK

Вы можете проверить, с какими сертификатами был подписан оригинальный APK и APK обновления, с помощью этих команд, используя Java keytool:

keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk

Это показывает подробную информацию о том, как был подписан APK, например:

Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
  MD5:  A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
  SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
  SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
         Signature algorithm name: SHA256withRSA
         Version: 3

Важные части, которые следует учитывать здесь - для каждого APK - это значение SHA1, значение Владелец и Действительный с/досильные > даты.


Если эта команда keytool не работает (для параметра -jarfile требуется Java 7), вы можете получить более основную информацию с помощью команды jarsigner:

jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk

Это, к сожалению, не показывает отпечаток SHA1, но показывает идентификатор владельца X.509 вместе с датами истечения срока действия сертификата. Например:

sm  4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)

    X.509, CN=My App, O=My Company, L=Somewhere, C=DE
    [certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
    [CertPath not validated: Path does not chain with any of the trust anchors]

Вы можете игнорировать любое сообщение "CertPath not validated", а также предупреждения о цепочках сертификатов или временных меток; они не актуальны в этом случае.

Сравните значения владельца, SHA1 и Expiry между APK

  • Если значение Владелец/ X.509 CN=Android Debug, O=Android, C=US, вы подписали APK со своим отладочный ключ, а не исходный ключ освобождения

  • Если значение отпечатка SHA1 отличается от исходного и обновленного APK, тогда вы не использовали один и тот же ключ подписи для обоих APK

  • Если значения идентификатора Владелец/ X.509 различаются, или даты истечения срока действия сертификата отличаются между двумя APK, тогда вы сделали не используйте один и тот же ключ подписи для обоих APK

Обратите внимание, что даже если значения Owner/X.509 идентичны между двумя сертификатами, это не означает, что сертификаты идентичны - если что-то еще не соответствует - например, значения отпечатка пальца - тогда сертификаты разные.


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

Если у двух APK есть другая информация сертификата, вы должны найти оригинальное хранилище ключей, то есть файл с первым значением отпечатка SHA1, которое вам сказал Google Play (или keytool).

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

keytool -list -keystore my-release.keystore

Просто нажмите Enter, если будет предложено ввести пароль - вам необязательно вводить его, если вы просто хотите быстро проверить значение SHA1.


Я не могу найти исходное хранилище ключей где-нибудь

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

Android упоминает это явно на странице Signing Your Application:

Предупреждение: Храните хранилище ключей и закрытый ключ в безопасном и безопасном месте и убедитесь, что у вас есть безопасное резервное копирование. Если вы опубликуете приложение в Google Play, а затем потеряете ключ, с которым вы подписали приложение, вы не сможете публиковать какие-либо обновления для своего приложения, так как вы всегда должны подписывать все версии вашего приложения с тем же ключом.

После первого выпуска APK все последующие релизы должны быть подписаны с помощью одного и того же ключа.


Можно ли извлечь исходный ключ подписи из исходного APK?

Нет. Это невозможно. APK содержит только общедоступную информацию, а не информацию личного ключа.


Могу ли я перейти на новый ключ подписи?

Нет. Даже если вы найдете оригинал, вы не можете подписывать APK с ключом A, а затем подписывать следующее обновление с помощью обоих ключей A и B, а затем подписывать следующее обновление после этого только с помощью клавиши B.

Подписание APK (или любого JAR файла) с несколькими ключами технически возможно, но Google Play больше не принимает APK с несколькими сигнатурами.

Попытка сделать это приведет к сообщению "Ваш APK был подписан с несколькими сертификатами. Пожалуйста, только подписывайте его одним сертификатом и загружайте его снова".


Что я могу сделать?

Вам нужно будет создать приложение с новым идентификатором приложения (например, изменить с "com.example.myapp" на "com.example.myapp2" ) и создать новый список в Google Play.

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

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

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

Ответ 3

Ничего - Google ясно говорит, что приложение идентифицируется ключами, используемыми для его подписания. Следовательно, если вы потеряли ключи, вам нужно создать новое приложение.

Ответ 4

Сегодня я столкнулся с той же проблемой, к сожалению, у меня было два псевдонима в моем файле хранилища ключей. enter image description here

Ответ 5

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

Решение -  Скачать это - KeyTool IUI версии 2.4.1 плагин введите описание изображения здесь

появится окно, в котором появится псевдоним. Если вы правильно указали файл jks. щелкните правой кнопкой мыши по псевдониму и нажмите "цепочка сертификатов просмотра".. он покажет ключ SHA1.. совместим этот ключ с ключом, который вы получаете, пока вы загружали apk в магазин приложений Google...

если он соответствует, то вы находитесь с правильным файлом jks и псевдонимом.

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

теперь перейдите к этому scrren, поместите тот же путь jks.. и пароль (среди вашего пароля) поместите любой путь в "Файл сертификата"

если на экране отображается какая-либо ошибка, тогда пароль не подходит. Если в нем нет какой-либо ошибки, значит, вы используете правильный файл jks. правильный псевдоним и пароль() теперь с этим вы можете загрузить свой apk в игровой магазин:)

Ответ 6

Если у вас есть предыдущий файл apk с вами (резервное копирование), используйте jarSigner для извлечения сертификата из этого apk, затем используйте этот ключ или используйте keytool для клонирования этого сертификата, возможно, это поможет... Полезные ссылки jarsigner docs и keytool docs.

Ответ 7

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

Однако, "Build"/"Чистый проект" исправили это.

Ответ 8

Я настоятельно рекомендую Keystore Explorer (https://keystore-explorer.org/), который позволяет вам получить доступ к вашему хранилищу ключей без необходимости загружать его в Google Play. Таким образом, вы можете определить, правильно ли вы вводите пароль.

Ответ 9

Недавно я столкнулся с этой проблемой, попробовав различные способы входа в систему, например, включить V1 или V2, войти в систему, изменив имя псевдонима и в последний раз узнал, что я использую неправильный файл хранилища ключей

Ответ 10

Вы можете использовать новую функцию подписи приложения Google Play для создания нового файла ключей.

После мая 2017 года Google Play Store добавит новую функцию в Play store и ее хорошие новости для разработчиков Android. С помощью этой функции разработчик может обновить свое приложение или Apk, которые потеряли файл KeyStore. Вам нужно включить подпись приложения Google Play на консоли Play Store.

https://support.google.com/googleplay/android-developer/answer/7384423?hl=en

http://www.geekcodehub.com/2018/05/23/keystore-lost-in-android/

Ответ 11

Моя [глупая] ошибка заключалась в том, что я использовал файл app-debug.apk вместо файла app-release.apk. Вам нужно выбрать "release" во фрейме "Build Variants" при создании подписанного APK. Файл app-release.apk должен находиться в папке "app\release" в корне вашего проекта.