APK має бути підписаний тими ж сертифікатами, що і попередня версія


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 має бути підписаний тим самим приватним ключем. Якщо назва пакету та сертифікат підписання не відповідають назвам існуючої версії, Market вважатиме це новим додатком і не запропонує його користувачам як оновлення.


14
Чудова відповідь. Я ніколи не розумів, що якщо ключ загублений, додаток не можна оновити. Необхідно пам’ятати, що слід створити резервну копію ключа в безпечному місці.
Петро Кнего

18
Що я б зазвичай робив - це зберігати файл зберігання ключів у svn. Помістіть нову папку з іменем облікових даних разом із стволом / тегом / гілками та збережіть там файл зберігання ключів. Також додайте новий .txt файл із зазначенням файлу зберігання ключів. Keystore так само важливий, як і вихідний код . Після того як ви його загубили (або забули пароль), Ви ВИГНУТИ ..
Крішнабхадра

42
Будь ласка, НЕ перевіряйте свій пароль для зберігання ключів (або будь-які паролі для цього питання) у контролі джерел, як говорить @Krishnabhadra. Тримайте сховище ключів і пароль, а пароль захищений.
Крістофер Орр

1
Що?! Але він просто сказав, що мій ключ був занадто старий, тому я видалив його і створив новий, тепер я це отримую!

2
@iwayneo Система збирання могла сказати вам, що ваш ключ налагодження занадто старий, але це малоймовірно, що сталося з ключем випуску , оскільки Google Play повинен відхилити ключі, термін дії яких закінчиться до жовтня 2033 року .
Крістофер Орр

126

Ви помилково підписали ключ налагодження?

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

Однак, якщо ви спробуєте завантажити оновлення, яке підписано за допомогою зберігання ключів налагодження, це повідомлення ви не побачите; Google Play відобразить повідомлення, яке відображається у запитанні, з посиланням на відбитки пальців SHA1.

Отже, по-перше, перевірте, чи підписали ви програму ключем налагодження помилково.


Як перевірити, які ключі підписання використовували?

Зберіть інформацію з АПК

Ви можете перевірити, з якими сертифікатами було підписано оригінальний 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 не перевірено", а також попередження про ланцюжки сертифікатів або часові позначки; вони не мають відношення до цього випадку.

Порівняйте значення власника, SHA1 та терміну придатності між APK

  • Якщо значення ідентичності власника / X.509 є CN=Android Debug, O=Android, C=US, тоді ви підписали APK за допомогою ключа налагодження , а не оригінального ключа випуску

  • Якщо значення відбитків SHA1 відрізняється від оригінальних та оновлених APK, ви не використовували однаковий ключ підпису для обох APK

  • Якщо значення ідентичності власника / X.509 відрізняються або дати закінчення терміну дії сертифіката відрізняються між двома APK, ви не використовували однаковий ключ підпису для обох APK

Зауважте, що навіть якщо значення Owner / X.509 однакові між двома сертифікатами, це не означає, що сертифікати однакові - якщо щось інше не відповідає - наприклад, значення відбитків пальців - сертифікати відрізняються.


Знайдіть оригінальну сховище ключів, перевірте резервні копії

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

Перегляньте всі файли зберігання ключів, які ви можете знайти на своєму комп’ютері та в будь-яких резервних копіях, поки у вас не буде файл із правильним відбитком 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.

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

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

Знову ж таки, переконайтеся, що у вас є безпечні резервні копії зберігання ключів і паролів, які ви використовуєте для цієї версії.


Я спробував команду, яку ви дали, для перевірки налагодження (яку я насправді шукав), але вона повертає помилку, що jar містить підписи, які не містять часової позначки. Я створив APK використовуючи цю тему: stackoverflow.com/questions/16622843 / ...
CularBytes

@RageCompex Ви не отримуєте вихід та лише помилку? Коли я запускаю цю команду, я також отримую попередження часової позначки (не помилка). Поки ви отримаєте вихід X.509, це все, що вам потрібно.
Крістофер Орр

Так, я отримую вихід X.509, так що, напевно, це не проблема? А як же [CertPath not validated: Path does not chain with any of the trust anchors], не проблема? Я бачу своє ім'я, CNтому я думаю, що я правильно його підписав :)
CularBytes

@RageCompex На це вже відповіді в розділі "Перевірка використовуваних ключів підпису".
Крістофер Орр

Сьогодні у мене був міні-інфаркт. Я використовував ці командні рядки, щоб з'ясувати прихований Keystore. Велике спасибі, чоловіче! Ти врятував мене ... Дійсно: D
Ajeet

11

Нічого - Google чітко говорить, що програма ідентифікується за ключами, які використовуються для її підписання. Отже, якщо ви втратили ключі, вам потрібно створити нову програму.


1
@sports Вони роблять вас попередити. Помітьте велике червоне Попереджувальне повідомлення: developer.android.com/tools/publishing/…
Крістофер Орр

2
@sports У будь-якому випадку ви можете опублікувати більше одного додатка в одному обліковому записі розробника, тому вам не потрібно платити знову.
Крістофер Орр

7

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


7

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

Однак Build => Clean Projectвиправили це.


1
Хм, я витратив 1 тиждень, зробив усе можливе. і час сказати "WTF", але це єдине, що допомогло. (Я також спробував визнати недійсними кеші, які не допомогли ..) Спасибі
Upsilon42


Дякую за це; Це справжнє збереження життя!
Ian Mbae

Я не бачу, що це пов'язано.
Нескінченні петлі

Дуже дякую!. Я випадково створив підписаний apk з різним файлом зберігання ключів і обліковими записами та завантажив його. Не вдалося отримати ту саму помилку навіть після завантаження apk з правильним зберіганням клавіш. Після години створення нових випусків з недійсним кешем, андроїд-студією та ПК перезапускається, це остаточно виправило це.
Арун

5

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

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

вікно з’явиться зараз, воно показує псевдонім ім'я .. якщо ви jks-файл правильний .. клацніть правою кнопкою миші на псевдонімі та натисніть «Переглянути ланцюжок сертифікатів» .. він покаже ключ SHA1 .. співставте цей ключ із ключем, який ви отримаєте поки ви завантажували apk в Google App Store ...

якщо він відповідає, то ви маєте правильний jks-файл та псевдонім ..

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

тепер перейдіть до цього scrren, покладіть той самий шлях jks .. а пароль (серед пароля, який у вас є) введіть будь-який шлях у "файл сертифіката"

якщо на екрані відображається помилка, то пароль не відповідає. Якщо він не відображає помилок, це означає, що ви маєте правильний файл jks. виправте псевдонім та пароль () тепер, коли ви можете завантажити свій apk в магазині гри :)


ви втратили приватний ключ, і ви змогли його отримати таким чином? Якщо відповідь "так", чи можливо ви посилання, де завантажити інструмент? І як відкрити додаток?
LS_

4

Якщо у вас був попередній файл apk (резервне копіювання), тоді використовуйте jarSigner для вилучення сертифіката з цього apk, потім використовуйте цей ключ або використовуйте keytool для клонування цього сертифіката, можливо, це допоможе ... Корисними посиланнями є документи jarsigner та документи keytool. .


5
"..використовуйте jarSigner для отримання сертифіката з цього apk" - Розкажіть, як це зробити?
Рубікон

14
Це не відновить приватний ключ, вам потрібно буде підписати apk ще раз.
botteaap

Apk має бути підписаний тим самим приватним ключем
om252345

3

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


1

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

Після травня 2017 року ігровий магазин Google додає нову функцію в Play Store і це хороші новини для розробників Android. За допомогою цієї функції Developer може оновити свій додаток або Apk, який втратив файл KeyStore. вам потрібно ввімкнути підпис програми Google Play на консолі Play Store.

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

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


0

Я нещодавно зіткнувся з цією проблемою, намагаючись різними способами увійти, як-от увімкнути V1 чи V2, увійшов, змінивши ім’я псевдоніма і востаннє дізнався, що я використовую неправильний файл зберігання ключів


0

Моя помилкова помилка полягала в тому, що я використовував файл app-debug.apk замість файла app-release.apk. Вам потрібно вибрати "реліз" у кадрі "Варіанти збірки", коли ви генеруєте підписаний APK. Файл app-release.apk повинен знаходитись у папці "app \ release" у корені проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.