АПК должен быть подписан с теми же сертификатами, что и предыдущая версия - PullRequest
181 голосов
/ 30 января 2011

Некоторое время назад я загрузил свое приложение в 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]

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

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

Ответы [ 11 ]

175 голосов
/ 30 января 2011

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

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

106 голосов
/ 10 октября 2014

Вы подписались с помощью ключа отладки по ошибке?

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» вместе с предупреждениями о цепочках сертификатов или временных отметках; в данном случае они не актуальны.

Сравните значения Owner, 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

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


Нигде не могу найти оригинальное хранилище ключей

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

Android явно упоминает об этом на странице , подписывающей ваше приложение :

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

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


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

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


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

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

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

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


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

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

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

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

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

8 голосов
/ 30 января 2011

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

6 голосов
/ 26 июля 2017

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

4 голосов
/ 10 августа 2016

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

Решение - Загрузить это - плагин Keytool IUI версии 2.4.1 enter image description here

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

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

теперь повезло, у меня есть куча паролей, чтобы соответствовать .. enter image description here

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

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

3 голосов
/ 30 января 2011

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

2 голосов
/ 08 февраля 2019

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

Однако, 'Build' / 'Clean Project' исправили это.

1 голос
/ 20 декабря 2018

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

0 голосов
/ 07 июня 2019

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

0 голосов
/ 26 марта 2019

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

После мая 2017 года в магазине Google Play добавлена ​​новая функция в магазине Play и это хорошая новость для разработчиков 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...