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

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

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

Caricamento fallito

Hai caricato un APK firmato con un certificato diverso dagli APK precedenti. È necessario utilizzare lo stesso certificato.

Gli APK esistenti sono firmati con i certificati con le impronte digitali:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
e i certificati utilizzati per firmare l’APK che hai caricato hanno le 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 ri-pubblicare l’applicazione, perché ha utenti attivi.

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

Niente. Leggi la documentazione: Pubblicare aggiornamenti su Android Market

Prima di caricare l’applicazione aggiornata, assicurati di aver aggiornato 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 lo considererà una nuova applicazione e non la offrirà agli utenti come aggiornamento.

Hai effettuato l’accesso 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 firmato in modalità di debug. Devi firmare l’APK in modalità di rilascio.”

Tuttavia, se si tenta di caricare un aggiornamento firmato con il keystore di debug, questo messaggio non verrà visualizzato; 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 tua chiave di debug per errore.


Come posso verificare quali chiavi di firma sono state utilizzate?

Raccogli le informazioni dall’APK

È ansible verificare con quali certificati è stato firmato l’APK originale e aggiornare l’APK utilizzando questi comandi, utilizzando lo keytool Java:

 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 ogni APK – sono il valore dell’impronta digitale SHA1 , il valore dell’id quadro Proprietario e le date Valido da / fino a .


Se il comando keytool non funziona (l’opzione -jarfile richiede Java 7), è ansible ottenere ulteriori informazioni di base tramite il comando jarsigner :

 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’id quadro del proprietario X.509, insieme alle date di scadenza del certificato. Per esempio:

 sm 4642892 Thu Apr 17 10:57:44 CEST 2014 classs.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] 

È ansible ignorare qualsiasi messaggio “CertPath non convalidato”, insieme agli avvisi relativi alle catene di certificati o ai timestamp; non sono rilevanti in questo caso.

Confronta i valori Proprietario, SHA1 e Scadenza tra gli APK

  • Se il valore dell’id quadro Proprietario / X.509 è CN=Android Debug, O=Android, C=US , allora l’APK è stato firmato con la chiave di debug , non con la chiave di rilascio originale

  • Se il valore di impronta digitale SHA1 è diverso tra l’APK originale e l’APK di aggiornamento, non hai utilizzato la stessa chiave di firma per entrambi gli APK

  • Se i valori dell’identity framework proprietario / X.509 sono diversi o le date di scadenza del certificato differiscono tra i due APK, non hai utilizzato 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 – allora 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 SHA1 che Google Play (o keytool ) ha detto.

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

 keytool -list -keystore my-release.keystore 

Basta premere Invio se viene richiesta la password – non è necessario inserirlo se si desidera semplicemente controllare rapidamente il valore SHA1.


Non riesco a trovare il keystore originale da nessuna parte

Se non riesci a trovare il keystore originale, non sarai mai in grado di 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 protetto e assicurarsi di disporre di backup sicuri. Se pubblichi un’applicazione su Google Play e perdi la chiave con cui hai firmato la tua app, non sarai in grado di pubblicare alcun aggiornamento sulla tua app, poiché devi sempre firmare tutte le versioni della tua app con la stessa chiave.

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


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

No, non è ansible. L’APK contiene solo informazioni pubbliche e non le informazioni chiave private.


Posso migrare a una nuova chiave di firma?

No. Anche se si trova l’originale, non è ansible firmare un APK con la chiave A, quindi firmare il prossimo aggiornamento con entrambi i tasti A e B, quindi firmare l’aggiornamento successivo dopo quello con la sola chiave B.

Firmare un APK (o qualsiasi file JAR) con più chiavi è tecnicamente ansible, ma Google Play non accetta più gli APK con più firme.

Se provi a farlo, visualizzerai 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 es. Cambiare da “com.example.myapp” a “com.example.myapp2”) e creare una nuova lista su Google Play.

Probabilmente dovrai anche cambiare il 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, le recensioni, ecc. E dovrai trovare un modo per convincere i tuoi clienti esistenti a disinstallare la vecchia app e installare la nuova versione.

Di nuovo, assicurati di avere backup sicuri del keystore e delle password che utilizzi per questa versione.

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

Oggi ho affrontato lo stesso problema, sfortunatamente, avevo due alias nel mio file di archivio chiavi. inserisci la descrizione dell'immagine qui

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

Qui ottengo la risposta per questa domanda. Dopo aver cercato troppo a lungo, riesco a decifrare la chiave e la password per questo. Ho dimenticato la mia chiave e anche il file jks ma fortunatamente conosco il gruppo di password che ho inserito. ma trovare le combinazioni corrette è stato per me il compito più difficile.

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

la finestra si aprirà ora mostra il nome dell’alias ..se il file jks è corretto .. fare clic destro su alias e premere “Visualizza catena di certificati” .. mostrerà la chiave SHA1 .. abbinare questa chiave con la chiave che si ottiene mentre stavi caricando l’apk nell’app store google …

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

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

ora vai a questo scrren metti lo stesso percorso jks .. e password (tra la password che hai) metti qualsiasi percorso in “File certificato”

se lo schermo mostra qualche errore, allora la password non coincide .. se non mostra alcun errore allora significa che stai con il file jks corretto. corretto alias e password () ora con quello puoi caricare il tuo apk nel Play Store 🙂

Ho affrontato questo problema di recente, dopo aver provato diversi modi di accesso come abilitare V1 o V2, effettuato l’accesso cambiando il nome dell’alias e ultimo arrivato a sapere che sto usando un file di archivio chiavi errato