APK musi być podpisany tymi samymi certyfikatami, co poprzednia wersja

200

Jakiś czas temu przesłałem moją aplikację do Google Play (kiedyś nazywał się Android Market).

Dzisiaj zaktualizowałem aplikację, ale usunąłem poprzedni plik kluczy i utworzyłem nowy.
Podczas przesyłania napisano, że plik APK musi być podpisany tymi samymi certyfikatami, co poprzednia wersja:

Przesyłanie nie powiodło się

Przesłałeś plik APK podpisany innym certyfikatem niż poprzednie pliki APK. Musisz użyć tego samego certyfikatu.

Twoje istniejące pliki APK są podpisane za pomocą certyfikatów za pomocą odcisków palców:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
oraz certyfikat (y) użyty (e) do podpisania przesłanego pliku APK mają odciski palców:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

Ale nie mam tego certyfikatu i nie chcę usuwać ani ponownie publikować aplikacji, ponieważ ma aktywnych użytkowników.

Co mogę zrobić, aby podpisać moją aplikację za pomocą nowego certyfikatu?

artem
źródło
26
Mam inny problem: próbowałem zaktualizować aplikację, ale wciąż pojawia się ten błąd. Faktem jest, że nigdy nie zmieniłem magazynu kluczy !!! Co mogę zrobić?!?
Mariux,
jak rozwiązałeś?
Elizabeth
@ int_32 jak to rozwiązać?
Amit Sharma

Odpowiedzi:

187

Nic. Przeczytaj dokumentację: Publikowanie aktualizacji w Android Market

Przed przesłaniem zaktualizowanej aplikacji upewnij się, że zwiększyłeś atrybuty android: versionCode i android: versionName w elemencie pliku manifestu. Ponadto nazwa pakietu musi być taka sama, a plik .apk musi być podpisany tym samym kluczem prywatnym. Jeśli nazwa pakietu i certyfikat podpisu nie są zgodne z istniejącą wersją, Market uzna ją za nową aplikację i nie zaoferuje jej użytkownikom jako aktualizacji.

Rubycon
źródło
14
Świetna odpowiedź. Nigdy nie zdawałem sobie sprawy, że w przypadku zgubienia klucza aplikacji nie można zaktualizować. Należy pamiętać o utworzeniu kopii zapasowej klucza w bezpiecznym miejscu.
Peter Knego
18
To, co normalnie zrobiłbym, to przechowywanie pliku kluczy w svn. Umieść nowy folder o nazwie poświadczenie wraz z łączem głównym / znacznikiem / oddziałami i zapisz w nim plik kluczy. Dodaj także nowy plik .txt wskazujący plik kluczy. Magazyn kluczy jest tak samo ważny jak kod źródłowy . Po zgubieniu (lub zapomnieniu hasła) jesteś WKRĘCANY ..
Krishnabhadra
42
Proszę NIE sprawdzać hasła magazynu kluczy (lub haseł dla tej sprawy) do kontroli źródła, jak mówi @Krishnabhadra. Przechowuj magazyn kluczy i hasło osobno, a hasło bezpieczne.
Christopher Orr,
1
Co?! Ale po prostu powiedział mi, że mój klucz jest za stary, więc go usunąłem i utworzyłem nowy, teraz rozumiem !?
2
@iwayneo System kompilacji mógł powiedzieć ci, że Twój klucz debugowania jest za stary, ale jest bardzo mało prawdopodobne, aby zdarzyło się to z kluczem wydania , ponieważ Google Play powinien odrzucić klucze, które wygasają przed październikiem 2033 roku .
Christopher Orr,
126

Czy podpisałeś się przez pomyłkę?

Google Play nie zezwala na publikowanie aplikacji podpisanej przy użyciu magazynu kluczy debugowania. Jeśli spróbujesz przesłać taki plik APK, Google Play nie powiedzie się z komunikatem „Przesłałeś plik APK podpisany w trybie debugowania. Musisz podpisać swój plik APK w trybie zwolnienia”.

Jeśli jednak spróbujesz załadować aktualizację podpisaną przy użyciu magazynu kluczy debugowania, ten komunikat nie zostanie wyświetlony; Google Play wyświetli komunikat pokazany w pytaniu, odnoszący się do odcisków palców SHA1.

Najpierw sprawdź, czy aplikacja została podpisana przez pomyłkę.


Jak sprawdzić, które klucze podpisu zostały użyte?

Zbierz informacje z APK

Możesz sprawdzić, za pomocą których certyfikatów podpisano oryginalny APK i zaktualizować APK, używając następujących poleceń, używając Java keytool:

keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk

To pokazuje szczegółowe informacje o tym, jak APK został podpisany, na przykład:

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

Ważne części, na które należy tutaj zwrócić uwagę - dla każdego pakietu APK - to wartość odcisku palca SHA1, wartość tożsamości właściciela i ważne od / do dat.


Jeśli to keytoolpolecenie nie działa ( -jarfileopcja wymaga Java 7), możesz uzyskać bardziej podstawowe informacje za pomocą jarsignerpolecenia:

jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk

To niestety nie pokazuje odcisku palca SHA1, ale pokazuje tożsamość właściciela X.509, wraz z datami wygaśnięcia certyfikatu. Na przykład:

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]

Możesz zignorować każdy komunikat „CertPath not validated”, a także ostrzeżenia o łańcuchach certyfikatów lub znacznikach czasu; w tym przypadku nie są istotne.

Porównaj wartości właściciela, SHA1 i wygaśnięcia między pakietami APK

  • Jeśli wartość właściciela / X.509 to CN=Android Debug, O=Android, C=US, oznacza to, że podpisałeś pakiet APK za pomocą klucza debugowania , a nie oryginalnego klucza wydania

  • Jeśli wartość odcisku palca SHA1 różni się między oryginalnym i aktualizowanym pakietem APK, to nie użyto tego samego klucza podpisu dla obu pakietów APK

  • Jeśli wartości tożsamości Owner / X.509 są różne lub daty wygaśnięcia certyfikatu różnią się między dwoma pakietami APK, nie użyto tego samego klucza podpisu dla obu plików APK

Zauważ, że nawet jeśli wartości Owner / X.509 są identyczne między dwoma certyfikatami, nie oznacza to, że certyfikaty są identyczne - jeśli cokolwiek innego się nie zgadza - na przykład wartości odcisku palca - to certyfikaty są różne.


Wyszukaj oryginalny magazyn kluczy, sprawdź kopie zapasowe

Jeśli dwa pliki APK mają różne informacje o certyfikacie, musisz znaleźć oryginalny plik kluczy, tj. Plik z pierwszą wartością odcisku palca SHA1, którą keytoolpodałeś Google Play (lub ).

Przeszukuj wszystkie pliki kluczy, które możesz znaleźć na komputerze, i we wszystkich posiadanych kopiach zapasowych, dopóki nie znajdziesz tego z prawidłowym odciskiem palca SHA1:

keytool -list -keystore my-release.keystore

Po prostu naciśnij, Enterjeśli pojawi się monit o hasło - niekoniecznie musisz go wprowadzić, jeśli chcesz szybko sprawdzić wartość SHA1.


Nigdzie nie mogę znaleźć oryginalnego magazynu kluczy

Jeśli nie możesz znaleźć oryginalnego magazynu kluczy, nigdy nie będziesz w stanie opublikować żadnych aktualizacji tej konkretnej aplikacji.

Android wspomina o tym wyraźnie na stronie Podpisywanie aplikacji :

Ostrzeżenie: przechowuj swój plik kluczy i klucz prywatny w bezpiecznym miejscu i upewnij się, że masz ich bezpieczne kopie zapasowe. Jeśli opublikujesz aplikację w Google Play, a następnie zgubisz klucz, za pomocą którego ją podpisałeś, nie będziesz w stanie opublikować żadnych aktualizacji aplikacji, ponieważ zawsze musisz podpisywać wszystkie wersje aplikacji za pomocą tego samego klucza.

Po pierwszym wydaniu pakietu APK wszystkie kolejne wydania muszą być podpisane dokładnie tym samym kluczem.


Czy mogę wyodrębnić oryginalny klucz podpisu z oryginalnego pliku APK?

Nie. Nie jest to możliwe. Plik APK zawiera tylko informacje publiczne, a nie informacje o kluczu prywatnym.


Czy mogę przeprowadzić migrację do nowego klucza do podpisywania?

Nie. Nawet jeśli znajdziesz oryginał, nie możesz podpisać pakietu APK za pomocą klucza A, a następnie podpisać następną aktualizację za pomocą obu kluczy A i B, a następnie podpisać następną aktualizację tylko za pomocą klucza B.

Podpisanie pliku APK (lub dowolnego pliku JAR) wieloma kluczami jest technicznie możliwe, ale Google Play nie akceptuje już plików APK z wieloma podpisami.

Próba zrobienia tego spowoduje wyświetlenie komunikatu „Twój plik APK został podpisany wieloma certyfikatami. Podpisz go tylko jednym certyfikatem i prześlij go ponownie”.


Co mogę zrobić?

Musisz zbudować aplikację z nowym identyfikatorem aplikacji (np. Zmienić z „com.example.myapp” na „com.example.myapp2”) i utworzyć zupełnie nowy wpis w Google Play.

Być może będziesz musiał także zmienić kod, aby ludzie mogli zainstalować nową aplikację, nawet jeśli mają zainstalowaną starą aplikację, np. Musisz upewnić się, że nie masz sprzecznych dostawców treści.

Utracisz istniejącą bazę instalacyjną, recenzje itp. I będziesz musiał znaleźć sposób, aby zachęcić obecnych klientów do odinstalowania starej aplikacji i zainstalowania nowej wersji.

Ponownie upewnij się, że masz bezpieczne kopie zapasowe magazynu kluczy i hasła używanych w tej wersji.

Christopher Orr
źródło
Wypróbowałem polecenie, które podałeś, w celu sprawdzenia debugowania (którego tak naprawdę szukałem), ale zwraca błąd, że słoik zawiera podpisy, które nie zawierają znacznika czasu. Utworzyłem aplikację przy użyciu tego wątku: stackoverflow.com/questions/16622843/…
CularBytes
@RageCompex Czy nie otrzymujesz danych wyjściowych, a jedynie błąd? Po uruchomieniu tego polecenia pojawia się także ostrzeżenie o sygnaturze czasowej (nie błąd). Tak długo, jak otrzymasz wyjście X.509, to wszystko, czego potrzebujesz.
Christopher Orr
Tak, dostaję wyjście X.509, więc chyba nie jest to problem? A co [CertPath not validated: Path does not chain with any of the trust anchors], nie problem? Widzę swoje imię w, CNwięc chyba poprawnie je podpisałem :)
CularBytes
@RageCompex Odpowiedź na to pytanie znajduje się już w sekcji „Sprawdź używane klucze podpisu”.
Christopher Orr
Miałem dzisiaj mini atak serca. Korzystając z tych linii poleceń, odkryłem ukryty Magazyn kluczy. Dzięki wielkie! Uratowałeś mnie ... Naprawdę: D
Ajeet
11

Nic - Google wyraźnie stwierdza, że ​​aplikacja jest identyfikowana przez klucze użyte do jej podpisania. W związku z tym, jeśli zgubiłeś klucze, musisz utworzyć nową aplikację.

Oddzwonienie Eugeniusza Mayevskiego
źródło
1
@sports one zrobić cię ostrzec. Zwróć uwagę na duży czerwony komunikat ostrzegawczy : developer.android.com/tools/publishing/…
Christopher Orr,
2
@sports W każdym przypadku możesz opublikować więcej niż jedną aplikację na tym samym koncie programisty, więc nie musisz płacić ponownie.
Christopher Orr,
7

Dzisiaj napotkałem ten sam problem, niestety miałem dwa aliasy w moim pliku kluczy.wprowadź opis zdjęcia tutaj

Krishan
źródło
7

Właśnie miałem to wydarzyło się z czystego niebieskiego. Naprawdę nie sądzę, żebym coś zmienił.

Jednak Build => Clean Projectto naprawiłem.

Dave Hubbard
źródło
1
Hmm, spędziłem 1 tydzień, zrobiłem wszystko co możliwe. i czas powiedzieć „WTF”, ale to jedyna rzecz, która pomogła. (Próbowałem również unieważnić pamięci podręczne, które nie pomogły ..) Dzięki
Upsilon42,
1
To rozwiązało problem po szaleństwie przez godzinę
Boris Legovic
Dzięki za to; To prawdziwa oszczędność życia!
Ian Mbae,
Nie widzę, żeby to było powiązane.
Infinite Loops,
Wielkie dzięki!. Przypadkowo wygenerowałem podpisany plik APK z innym plikiem kluczy i poświadczeniami i przesłałem go. Utrzymywał się ten sam błąd, nawet po przesłaniu apk z prawidłowym magazynem kluczy. Po godzinie tworzenia nowych wersji z unieważnioną pamięcią podręczną, Android Studio i PC ponownie się uruchomiły, to w końcu to naprawiło.
Arun
5

Tutaj otrzymuję odpowiedź na to pytanie. Po zbyt długim poszukiwaniu wreszcie mogę złamać klucz i hasło do tego. Zapomniałem mojego klucza i aliasu również pliku jks, ale na szczęście znam wiązkę hasła, którą w nim umieściłem. ale znalezienie odpowiednich kombinacji było dla mnie najtrudniejszym zadaniem.

Rozwiązanie - Pobierz to - Wtyczka Keytool IUI wersja 2.4.1 wprowadź opis zdjęcia tutaj

okno wyskoczy teraz teraz pokazuje nazwę aliasu .. jeśli plik jks jest poprawny .. kliknij alias prawym przyciskiem myszy i kliknij „wyświetl łańcuch certyfikatów” .. pokaże klucz SHA1 .. dopasuj ten klucz do tego, który otrzymujesz podczas przesyłania apk w Google App Store ...

jeśli pasuje, to masz odpowiedni plik jks i alias ..

teraz mam szczęście, że mam kilka pasujących haseł ... wprowadź opis zdjęcia tutaj

teraz przejdź do tego skryptu wstaw tę samą ścieżkę jks .. i hasło (wśród hasła, które masz) umieść dowolną ścieżkę w „pliku certyfikatu”

jeśli na ekranie pojawi się jakikolwiek błąd, hasło nie jest zgodne. Jeśli nie wyświetla żadnego błędu, oznacza to, że masz prawidłowy plik jks. popraw teraz alias i hasło (), dzięki czemu możesz przesłać swoją aplikację w sklepie Play :)

Arun Yadav
źródło
zgubiłeś klucz prywatny i udało Ci się go odzyskać w ten sposób? Jeśli odpowiedź brzmi „tak”, czy możesz podać link, skąd pobrać narzędzie? Jak mogę otworzyć aplikację?
LS_
4

Jeśli masz przy sobie poprzedni plik apk (kopia zapasowa), użyj jarSigner, aby wyodrębnić certyfikat z tego apka, a następnie użyj tego klucza lub użyj keytool do sklonowania tego certyfikatu, być może to pomoże ... Pomocne linki to dokumenty jarsigner i dokumenty keytool .

om252345
źródło
5
„.. użyj jarSigner do wyodrębnienia certyfikatu z tej aplikacji” - Powiedz nam, jak to zrobić?
Rubycon
14
To nie odzyska klucza prywatnego, którego będziesz musiał ponownie podpisać APK.
botteaap 30.01.11
Apk musi być podpisany tym samym kluczem prywatnym
om252345
3

Bardzo polecam Keystore Explorer ( https://keystore-explorer.org/ ), który umożliwia dostęp do twojego magazynu kluczy bez konieczności przesyłania go do Google Play. W ten sposób możesz rozwiązać problem nieprawidłowego wprowadzania hasła.

drdiv
źródło
1

Możesz użyć nowej funkcji podpisywania aplikacji Google Play, aby wygenerować nowy plik klucza.

Po maju 2017 r. Sklep Google Play dodaje nową funkcję do sklepu Play i jest to dobra wiadomość dla programistów Androida. Dzięki tej funkcji programista może zaktualizować swoją aplikację lub aplikację, która straciła plik kluczy. musisz włączyć podpisywanie aplikacji Google Play na konsoli Play Store.

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

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

Jacek
źródło
0

Ostatnio napotkałem ten problem, po wypróbowaniu różnych sposobów logowania, takich jak włączanie V1 lub V2, zalogowanie się poprzez zmianę nazwy aliasu i ostatnie sprawdzenie, czy używam niewłaściwego pliku magazynu kluczy

użytkownik 2837615
źródło
0

Mój [głupi] błąd polegał na tym, że użyłem pliku app-debug.apk zamiast pliku app-release.apk. Musisz wybrać opcję „release” w ramce „Build Variants” podczas generowania podpisanego pliku APK. Plik app-release.apk powinien znajdować się w folderze „app \ release” w katalogu głównym projektu.

M. Marmor
źródło