it-roy-ru.com

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

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

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

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

180
arts777

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

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

174
Rubycon

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

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

Однако, если вы попытаетесь загрузить pdate, который подписан с хранилищем ключей отладки, вы not ​​увидите это сообщение; В 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.

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

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

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

104
Christopher Orr

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

8
Eugene Mayevski 'Allied Bits

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

6
Krishan

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

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

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

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

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

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

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

4
Arun Yadav

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

3
om252345

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

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

2
Dave Hubbard

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

1
drdiv

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

0
M. Marmor

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

0
user2837615

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