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

200

Я загрузил свое приложение в 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]

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

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

артем
источник
26
У меня другая проблема: я пытался обновить приложение, но он продолжает говорить об этой ошибке. Дело в том, что я никогда не менял хранилище ключей !!! Что мне делать?!?
Mariux
как ты решил ??
Элизабет
@ int_32 как ты это решил ??
Амит Шарма

Ответы:

187

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

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

Rubycon
источник
14
Отличный ответ. Я так и не понял, что если ключ потерян, то приложение не может быть обновлено. Необходимо иметь в виду, чтобы сделать резервную копию ключа в безопасном месте.
Питер Кнего
18
Что я обычно делал, так это сохранял файл хранилища ключей в SVN. Поместите новую папку с именем credential вместе с trunk / tag / branch и сохраните там файл хранилища ключей. Также добавьте новый файл .txt, указывающий файл хранилища ключей. Keystore так же важен, как и исходный код . Как только вы потеряли его (или забыли пароль), вы ВИНТОВАНЫ ...
Кришнабхадра
42
Пожалуйста, НЕ проверяйте свой пароль хранилища ключей (или любые другие пароли в этом отношении) в системе контроля версий, как говорит @Krishnabhadra. Храните хранилище ключей и пароль отдельно, а пароль в безопасности.
Кристофер Орр
1
Какой?! Но он просто сказал мне, что мой ключ слишком стар, поэтому я удалил его и создал новый, теперь я получаю это !?
2
@iwayneo Система сборки могла бы сказать вам, что ваш ключ отладки был слишком стар, но это вряд ли произошло с ключом релиза , поскольку Google Play должен отклонять ключи, срок действия которых истекает до октября 2033 года .
Кристофер Орр
127

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

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

Просто нажмите, Enterесли будет предложено ввести пароль - вам не обязательно вводить его, если вы просто хотите быстро проверить значение 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.

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

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

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

Кристофер Орр
источник
Я попробовал команду, которую вы дали, для проверки на отладку (которую я на самом деле искал), но она возвращает ошибку о том, что в банке есть подписи, которые не содержат метки времени. Я создал свой apk, используя эту тему: stackoverflow.com/questions/16622843/…
CularBytes
@RageCompex У вас нет вывода и только ошибка? Когда я запускаю эту команду, я также получаю предупреждение о временной отметке (не ошибка). Пока вы получаете выход X.509, это все, что вам нужно.
Кристофер Орр
Да, я получаю вывод X.509, так что это не проблема, я думаю? Как насчет [CertPath not validated: Path does not chain with any of the trust anchors], не проблема, eather? Я вижу свое имя на, CNтак что я думаю, что я правильно подписал его :)
CularBytes
@RageCompex На этот вопрос уже дан ответ в разделе «Проверка используемых ключей подписи».
Кристофер Орр
У меня был мини-сердечный приступ сегодня. Я использовал эти командные строки, чтобы выяснить скрытое хранилище ключей. Большое спасибо, чувак! Вы спасли меня ... Действительно: D
Ajeet
11

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

Евгений Маевский "Обратный звонок"
источник
1
@sports Они делают вас предупредить. Обратите внимание на большое красное предупреждающее сообщение: developer.android.com/tools/publishing/…
Кристофер Орр
2
@sports В любом случае вы можете опубликовать более одного приложения в одной учетной записи разработчика, поэтому вам не нужно платить снова.
Кристофер Орр
7

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

Krishan
источник
7

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

Однако Build => Clean Projectисправили это.

Дейв Хаббард
источник
1
Хм, я потратил 1 неделю, сделал все возможное. и пришло время сказать "WTF", но это единственное, что помогло. (Я также пытался аннулировать кэши, которые не помогли ..) Спасибо
Upsilon42
1
Это
решило
Спасибо за это; Это реальный спасатель жизни!
Ян Мбэ
Я не вижу, что это связано
Бесконечные циклы
Большое спасибо!. Я случайно создал подписанный apk с другим файлом хранилища ключей и учетными данными и загрузил его. Получил ту же ошибку даже после загрузки apk с правильным хранилищем ключей. После часа создания новых выпусков с недействительным кешем, перезапуском android studio и ПК это наконец-то исправилось.
Арун
5

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

Решение - Загрузите это - Плагин Keytool IUI версии 2.4.1 введите описание изображения здесь

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

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

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

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

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

Арун Ядав
источник
Вы потеряли закрытый ключ и смогли получить его таким образом? Если ответ «да», можете ли вы указать ссылку, где скачать инструмент? А как мне открыть приложение?
LS_
4

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

om252345
источник
5
«..use jarSigner для извлечения сертификата из этого apk» - Скажите, как это сделать?
Рубикон
14
Это не восстановит закрытый ключ, который вам понадобится снова подписать apk.
botteaap
Apk должен быть подписан тем же закрытым ключом
om252345
3

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

drdiv
источник
1

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

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

user2837615
источник
0

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

М. Мармор
источник