L'apk deve essere firmato con gli stessi certificati della versione precedente


200

Avevo caricato la mia app su Google Play (quando si chiamava Android Market) qualche tempo fa.

Oggi ho aggiornato l'app, ma avevo eliminato il keystore precedente e ne avevo creato uno nuovo.
Durante il caricamento, dice che l'APK deve essere firmato con gli stessi certificati della versione precedente:

Caricamento fallito

Hai caricato un APK che è firmato con un certificato diverso rispetto ai tuoi APK precedenti. È necessario utilizzare lo stesso certificato.

Gli APK esistenti sono firmati con i certificati con impronte digitali:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
e il certificato utilizzato per firmare l'APK caricato ha impronte digitali:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

Ma non ho questo certificato e non voglio cancellare e ripubblicare l'applicazione, perché ha utenti attivi.

Cosa posso fare per firmare la mia app con un nuovo certificato?


26
Sto riscontrando un problema diverso: ho provato ad aggiornare un'app ma mi viene sempre detto questo errore. Il fatto è che non ho mai cambiato il keystore !!! Cosa posso fare?!?
Mariux,

come hai risolto ??
Elizabeth,

@ int_32 come lo risolvi ??
Amit Sharma,

Risposte:


187

Niente. Leggi la documentazione: Pubblicazione degli aggiornamenti su Android Market

Prima di caricare l'applicazione aggiornata, assicurarsi di aver incrementato gli attributi android: versionCode e android: versionName nell'elemento del file manifest. Inoltre, il nome del pacchetto deve essere lo stesso e il .apk deve essere firmato con la stessa chiave privata. Se il nome del pacchetto e il certificato di firma non corrispondono a quelli della versione esistente, Market la considererà una nuova applicazione e non la offrirà agli utenti come aggiornamento.


14
Bella risposta. Non ho mai capito che se si perde la chiave l'app non può essere aggiornata. È necessario tenere presente il backup della chiave in un luogo sicuro.
Peter Knego,

18
Quello che farei normalmente è archiviare il file keystore in svn. Inserire una nuova cartella denominata credenziale, insieme a trunk / tag / branch e archiviare lì il file del keystore. Aggiungere anche un nuovo file .txt che indica il file keystore. Il keystore è importante quanto il codice sorgente . Quando l'hai persa (o hai dimenticato la password), sei VITE ..
Krishnabhadra,

42
Si prega di NON controllare la password del keystore (o eventuali password del caso) nel controllo del codice sorgente, come dice @Krishnabhadra. Mantenere il keystore e la password separati e la password protetta.
Christopher Orr,

1
Che cosa?! Ma mi ha appena detto che la mia chiave era troppo vecchia, quindi l'ho cancellata e ne ho creata una nuova ora ho capito !?

2
@iwayneo Il sistema di generazione potrebbe averti detto che la tua chiave di debug era troppo vecchia, ma è molto improbabile che si sia verificato con una chiave di rilascio , poiché Google Play dovrebbe rifiutare le chiavi che scadono prima dell'ottobre 2033 .
Christopher Orr,

127

Hai firmato con la chiave di debug per errore?

Google Play non ti consente di pubblicare un'app firmata con il tuo keystore di debug. Se provi a caricare un tale APK, Google Play fallirà con il messaggio "Hai caricato un APK che era stato firmato in modalità debug. Devi firmare il tuo APK in modalità di rilascio".

Tuttavia, se si tenta di caricare un aggiornamento che è firmato con il keystore di debug, si non vedere questo messaggio; Google Play visualizzerà il messaggio mostrato nella domanda, facendo riferimento alle impronte digitali SHA1.

Quindi, in primo luogo, controlla se hai firmato l'app con la chiave di debug per errore.


Come posso verificare quali chiavi di firma sono state utilizzate?

Raccogliere le informazioni dall'APK

È possibile verificare con quali certificati sono stati firmati l'APK originale e l'APK di aggiornamento utilizzando questi comandi, utilizzando Java keytool:

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

Questo mostra informazioni dettagliate su come è stato firmato un APK, ad esempio:

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

Le parti importanti da notare qui - per ciascun APK - sono il valore dell'impronta digitale SHA1 , il valore dell'identità del proprietario e il Valido da / fino alle date.


Se quel keytoolcomando non funziona (l' -jarfileopzione richiede Java 7), è possibile ottenere ulteriori informazioni di base tramite il jarsignercomando:

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

Questo purtroppo non mostra l'impronta digitale SHA1, ma mostra l'identità del proprietario X.509, insieme alle date di scadenza del certificato. Per esempio:

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]

È possibile ignorare qualsiasi messaggio "CertPath non convalidato", insieme ad avvertenze su catene di certificati o timestamp; non sono rilevanti in questo caso.

Confronta i valori Proprietario, SHA1 e Scadenza tra gli APK

  • Se il valore dell'identità del proprietario / X.509 è CN=Android Debug, O=Android, C=US, allora hai firmato l'APK con la chiave di debug , non la chiave di rilascio originale

  • Se il valore dell'impronta digitale SHA1 è diverso tra gli APK originali e di aggiornamento, non è stata utilizzata la stessa chiave di firma per entrambi gli APK

  • Se i valori dell'identità del proprietario / X.509 sono diversi o le date di scadenza del certificato differiscono tra i due APK, non è stata utilizzata la stessa chiave di firma per entrambi gli APK

Si noti che anche se i valori Proprietario / X.509 sono identici tra i due certificati, ciò non significa che i certificati siano identici - se qualcos'altro non corrisponde - come i valori delle impronte digitali - i certificati sono diversi.


Cerca il keystore originale, controlla i backup

Se i due APK hanno informazioni sul certificato diverse, è necessario trovare il keystore originale, ovvero il file con il primo valore di impronta digitale SHA1 che Google Play (o keytool) ti ha detto.

Cerca tra tutti i file di archivio chiavi che puoi trovare sul tuo computer e in tutti i backup che hai, fino a quando non hai quello con l'impronta digitale SHA1 corretta:

keytool -list -keystore my-release.keystore

Basta premere Enterse viene richiesta la password: non è necessario immetterla se si desidera verificare rapidamente il valore SHA1.


Non riesco a trovare il keystore originale da nessuna parte

Se non riesci a trovare il keystore originale, non potrai mai pubblicare aggiornamenti su questa particolare app.

Android lo menziona esplicitamente nella pagina Firma la tua applicazione :

Avviso: conservare il keystore e la chiave privata in un luogo sicuro e assicurarsi di disporre di backup sicuri. Se pubblichi un'app su Google Play e perdi la chiave con cui hai firmato l'app, non potrai pubblicare aggiornamenti sulla tua app, poiché devi sempre firmare tutte le versioni dell'app con la stessa chiave.

Dopo la prima versione di un APK, tutte le versioni successive devono essere firmate con la stessa chiave esatta.


Posso estrarre la chiave di firma originale dall'APK originale?

No, non è possibile. L'APK contiene solo informazioni pubbliche e non informazioni sulla chiave privata.


Posso migrare su una nuova chiave di firma?

No. Anche se trovi l'originale, non puoi firmare un APK con il tasto A, quindi firmare il prossimo aggiornamento con entrambi i tasti A e B, quindi firmare il successivo aggiornamento solo con il tasto B.

La firma di un APK (o di qualsiasi file JAR) con più chiavi è tecnicamente possibile, ma Google Play non accetta più APK con più firme.

Tentare di farlo comporterà il messaggio "Il tuo APK è stato firmato con più certificati. Firma solo con un certificato e caricalo di nuovo."


Cosa posso fare?

Dovrai creare la tua app con un nuovo ID applicazione (ad esempio passare da "com.example.myapp" a "com.example.myapp2") e creare una nuova inserzione su Google Play.

Probabilmente dovrai anche cambiare il tuo codice in modo che le persone possano installare la nuova app anche se hanno installata la vecchia app, ad esempio devi assicurarti di non avere provider di contenuti in conflitto.

Perderai la tua base di installazione esistente, recensioni ecc. E dovrai trovare un modo per convincere i tuoi clienti esistenti a disinstallare la vecchia app e installare la nuova versione.

Ancora una volta, assicurati di avere backup sicuri del keystore e delle password che usi per questa versione.


Ho provato il comando che hai dato, per controllare il debug (che stavo effettivamente cercando), ma restituisce un errore che il jar contiene firme che non includono un timestamp. Ho creato il mio apk utilizzando questa discussione: stackoverflow.com/questions/16622843/...
CularBytes

@RageCompex Non ricevi alcun output e solo un errore? Quando eseguo quel comando, ricevo anche un avviso timestamp (non un errore). Finché ottieni l'output X.509, è tutto ciò di cui hai bisogno.
Christopher Orr,

Sì, ottengo l'output X.509, quindi non è un problema immagino? Che dire [CertPath not validated: Path does not chain with any of the trust anchors], non un problema eather? Vedo il mio nome a CNquindi immagino di averlo firmato correttamente :)
CularBytes

@RageCompex Questa è già una risposta nella sezione "Verifica le chiavi di firma utilizzate".
Christopher Orr,

Ho avuto un mini attacco di cuore oggi. Ho usato queste righe di comando per capire il Keystore nascosto. Grazie mille amico! Mi hai salvato ... Davvero: D
Ajeet il

11

Nulla: Google afferma chiaramente che l'applicazione è identificata dalle chiavi utilizzate per firmarla. Di conseguenza, se hai perso le chiavi, devi creare una nuova applicazione.


1
@sports Essi fanno avvertire. Notare il grande messaggio di avvertimento rosso : developer.android.com/tools/publishing/…
Christopher Orr

2
@sports In ogni caso, puoi pubblicare più di un'app sullo stesso account sviluppatore, quindi non devi pagare di nuovo.
Christopher Orr,

7

Oggi ho riscontrato lo stesso problema, sfortunatamente, avevo due alias nel mio file keystore.inserisci qui la descrizione dell'immagine


7

Ho appena avuto questo accadere dal blu chiaro. Non credo davvero di aver cambiato nulla.

Tuttavia, Build => Clean Projectrisolto.


1
Ho passato 1 settimana, ho fatto tutto il possibile. ed è tempo di dire "WTF", ma è l'unica cosa che ha aiutato. (Ho anche provato cache invalide che non hanno aiutato ..) Grazie
Upsilon42

1
Ciò ha risolto il problema dopo essere impazzito per un'ora
Boris Legovic

Grazie per questo; È un vero salvavita!
Ian Mbae,

Non vedo che questo è correlato.
Infinite Loops,

Molte grazie!. Ho generato accidentalmente un apk firmato con file e credenziali keystore diversi e l'ho caricato. Ho continuato a ricevere lo stesso errore anche dopo aver caricato l'apk con il keystore corretto. Dopo un'ora di creazione di nuove versioni con cache non valida, riavvio di Android Studio e PC, questo finalmente risolto.
Arun,

5

Qui ho la risposta per quella domanda. Dopo aver cercato troppo a lungo finalmente riesco a decifrare la chiave e la password per questo. Dimentico la mia chiave e alias anche il file jks ma per fortuna conosco il mazzo di password che cosa avevo inserito. ma trovare combinazioni corrette per quello è stato il compito più difficile per me.

Soluzione: scarica questo plug-in Keytool IUI versione 2.4.1 inserisci qui la descrizione dell'immagine

la finestra si aprirà ora mostrerà il nome alias .. se il tuo file jks è corretto .. fai clic destro su alias e premi "visualizza catena certificati" .. mostrerà la chiave SHA1 .. abbina questa chiave con la chiave che ottieni mentre caricavi l'apk nell'App Store di Google ...

se corrisponde allora sei con il giusto file jks e alias ..

ora fortunato ho un sacco di password da abbinare .. inserisci qui la descrizione dell'immagine

ora vai a questo scrren inserisci lo stesso percorso jks .. e la password (tra le password che hai) inserisci qualsiasi percorso in "File certificato"

se lo schermo mostra qualche errore, la password non corrisponde ... se non mostra alcun errore, significa che hai il file jks corretto. alias e password corretti () ora puoi caricare l'apk nel Play Store :)


hai perso la chiave privata e sei riuscito a recuperarla in questo modo? Se la risposta è sì, è possibile collegare dove scaricare lo strumento? E come posso aprire l'app?
LS_

4

Se hai un file apk precedente con te (backup) quindi usa jarSigner per estrarre il certificato da quell'apk, quindi usa quella chiave o usa lo strumento chiave per clonare quel certificato, potrebbe essere che ti aiuterà ... I link utili sono documenti jarsigner e documenti keytool .


5
"..use jarSigner per estrarre il certificato da quell'apk" - Dicci come fare?
Rubycon,

14
Ciò non ripristinerà la chiave privata di cui avresti bisogno per firmare di nuovo l'apk.
botteaap

L'apk deve essere firmato con la stessa chiave privata
om252345

3

Consiglio vivamente Keystore Explorer ( https://keystore-explorer.org/ ) che ti consente di accedere al tuo keystore senza doverlo caricare su Google Play. In questo modo puoi risolvere se stai inserendo la password in modo errato.


1

Puoi utilizzare la nuova funzionalità di firma dell'app Google Play per generare un nuovo file chiave.

Dopo maggio 2017 Google Play Store aggiunge una nuova funzionalità su Play Store ed è una buona notizia per gli sviluppatori Android. Da questa funzione, lo sviluppatore può aggiornare la propria app o l'apk che ha perso un file KeyStore. devi abilitare la firma dell'app google play sulla console del 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

Avevo affrontato questo problema di recente, dopo aver provato diversi modi per accedere come abilitare V1 o V2, accedere cambiando il nome alias e per ultimo ho scoperto che sto usando un file di archivio chiavi errato


0

Il mio errore [sciocco] è stato che ho usato il file app-debug.apk invece del file app-release.apk. Devi scegliere "rilascia" nel frame "Crea varianti" quando generi un APK firmato. Il file app-release.apk dovrebbe trovarsi nella cartella "app \ release" nella radice del progetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.