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]

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

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

+178
источник поделиться
11 ответов

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

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

+174
источник

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

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.

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

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

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

+102
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

+8
источник

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

+6
источник

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

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

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

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

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

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

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

+4
источник

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

+3
источник

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

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

+2
источник

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

+1
источник

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

0
источник

Вы можете использовать новую функцию подписи приложения 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/

0
источник

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос