L'APK doit être signé avec les mêmes certificats que la version précédente

200

J'avais téléchargé mon application sur Google Play (à l'époque où elle s'appelait Android Market) il y a quelque temps.

Aujourd'hui, j'ai mis à jour l'application, mais j'avais supprimé le magasin de clés précédent et créé un nouveau.
Lors du téléchargement, il indique que l'APK doit être signé avec les mêmes certificats que la version précédente:

Échec du téléchargement

Vous avez importé un fichier APK signé avec un certificat différent dans vos fichiers APK précédents. Vous devez utiliser le même certificat.

Vos fichiers APK existants sont signés avec le (s) certificat (s) avec empreinte (s):
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
et le ou les certificats utilisés pour signer l'APK que vous avez téléchargé ont des empreintes digitales:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

Mais je n'ai pas ce certificat et je ne veux pas supprimer et republier l'application, car elle a des utilisateurs actifs.

Que puis-je faire pour signer mon application avec un nouveau certificat?

artem
la source
26
J'ai un problème différent: j'ai essayé de mettre à niveau une application mais cela me fait répéter cette erreur. Le fait est que je n'ai jamais changé de magasin de clés !!! Que puis-je faire?!?
Mariux
comment avez-vous résolu ??
Elizabeth
@ int_32 comment le résolvez-vous ??
Amit Sharma

Réponses:

187

Rien. Lisez la documentation: Publication des mises à jour sur Android Market

Avant de télécharger l'application mise à jour, assurez-vous d'avoir incrémenté les attributs android: versionCode et android: versionName dans l'élément du fichier manifeste. En outre, le nom du package doit être le même et le .apk doit être signé avec la même clé privée. Si le nom du package et le certificat de signature ne correspondent pas à ceux de la version existante, Market la considérera comme une nouvelle application et ne la proposera pas aux utilisateurs en tant que mise à jour.

Rubycon
la source
14
Très bonne réponse. Je n'ai jamais réalisé que si la clé est perdue, l'application ne peut pas être mise à jour. Doit garder à l'esprit pour sauvegarder la clé dans un endroit sûr.
Peter Knego
18
Ce que je ferais normalement, c'est de stocker le fichier de clés dans svn. Placez un nouveau dossier nommé credential, avec trunk / tag / branches, et stockez-y le fichier de clés. Ajoutez également un nouveau fichier .txt indiquant le fichier de clés. Le magasin de clés est aussi important que le code source . Une fois que vous l'avez perdu (ou oublié le mot de passe), vous êtes SCREWED ..
Krishnabhadra
42
Veuillez NE PAS vérifier votre mot de passe de magasin de clés (ou tout autre mot de passe d'ailleurs) dans le contrôle de source, comme le dit @Krishnabhadra. Gardez le magasin de clés et le mot de passe séparés, et le mot de passe sécurisé.
Christopher Orr
1
Quoi?! Mais il m'a juste dit que ma clé était trop ancienne, alors je l'ai supprimée et j'en ai créé une nouvelle maintenant, j'ai compris!?
2
@iwayneo Le système de construction vous a peut-être dit que votre clé de débogage était trop ancienne, mais il est très peu probable que cela se soit produit avec une clé de version , car Google Play devrait rejeter les clés qui expirent avant octobre 2033 .
Christopher Orr
127

Avez-vous signé par erreur la clé de débogage?

Google Play ne vous permet pas de publier une application signée avec votre magasin de clés de débogage. Si vous essayez de télécharger un tel fichier APK, Google Play échouera avec le message "Vous avez téléchargé un fichier APK signé en mode débogage. Vous devez signer votre fichier APK en mode de publication."

Toutefois, si vous essayez de télécharger une mise à jour signée avec le magasin de clés de débogage, vous ne verrez pas ce message; Google Play affichera le message affiché dans la question, faisant référence aux empreintes digitales SHA1.

Vérifiez d'abord si vous avez signé l'application avec votre clé de débogage par erreur.


Comment vérifier quelles clés de signature ont été utilisées?

Rassemblez les informations de l'APK

Vous pouvez vérifier avec quels certificats l'APK d'origine et l'APK de mise à jour ont été signés à l'aide de ces commandes, à l'aide de Java keytool:

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

Cela vous montre des informations détaillées sur la façon dont un APK a été signé, par exemple:

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

Les parties importantes à noter ici - pour chaque APK - sont la valeur d'empreinte digitale SHA1 , la valeur d'identité du propriétaire et les dates de validité du / au .


Si cette keytoolcommande ne fonctionne pas (l' -jarfileoption nécessite Java 7), vous pouvez obtenir des informations plus basiques via la jarsignercommande:

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

Cela ne montre malheureusement pas l'empreinte SHA1, mais montre l'identité du propriétaire X.509, ainsi que les dates d'expiration du certificat. Par exemple:

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]

Vous pouvez ignorer tout message "CertPath non validé", ainsi que les avertissements sur les chaînes de certificats ou les horodatages; ils ne sont pas pertinents dans ce cas.

Comparez les valeurs Owner, SHA1 et Expiration entre les fichiers APK

  • Si la valeur d'identité Owner / X.509 est CN=Android Debug, O=Android, C=US, alors vous avez signé l'APK avec votre clé de débogage , pas la clé de version d'origine

  • Si la valeur d'empreinte digitale SHA1 est différente entre les fichiers APK d'origine et de mise à jour, vous n'avez pas utilisé la même clé de signature pour les deux fichiers APK

  • Si les valeurs d'identité du propriétaire / X.509 sont différentes ou si les dates d'expiration des certificats diffèrent entre les deux fichiers APK, vous n'avez pas utilisé la même clé de signature pour les deux fichiers APK.

Notez que même si les valeurs Owner / X.509 sont identiques entre les deux certificats, cela ne signifie pas que les certificats sont identiques - si rien d'autre ne correspond - comme les valeurs d'empreintes digitales - alors les certificats sont différents.


Recherchez le fichier de clés d'origine, vérifiez les sauvegardes

Si les deux fichiers APK ont des informations de certificat différentes, vous devez trouver le fichier de clés d'origine, c'est-à-dire le fichier avec la première valeur d'empreinte digitale SHA1 que Google Play (ou keytool) vous a indiqué.

Recherchez tous les fichiers de clés que vous pouvez trouver sur votre ordinateur et dans toutes les sauvegardes que vous avez, jusqu'à ce que vous ayez celui avec l'empreinte SHA1 correcte:

keytool -list -keystore my-release.keystore

Appuyez simplement sur Entersi vous êtes invité à entrer le mot de passe - vous n'avez pas nécessairement à le saisir si vous voulez simplement vérifier rapidement la valeur SHA1.


Je ne trouve le magasin de clés d'origine nulle part

Si vous ne trouvez pas le magasin de clés d'origine, vous ne pourrez jamais publier de mises à jour de cette application particulière.

Android le mentionne explicitement sur la page Signing Your Application :

Avertissement: Conservez votre magasin de clés et votre clé privée dans un endroit sûr et sécurisé et assurez-vous que vous en avez des sauvegardes sécurisées. Si vous publiez une application sur Google Play et perdez ensuite la clé avec laquelle vous avez signé votre application, vous ne pourrez pas publier de mises à jour de votre application, car vous devez toujours signer toutes les versions de votre application avec la même clé.

Après la première version d'un fichier APK, toutes les versions suivantes doivent être signées avec exactement la même clé.


Puis-je extraire la clé de signature d'origine de l'APK d'origine?

Non, ce n'est pas possible. L'APK ne contient que des informations publiques et non vos informations de clé privée.


Puis-je migrer vers une nouvelle clé de signature?

Non. Même si vous trouvez l'original, vous ne pouvez pas signer un APK avec la clé A, puis signer la prochaine mise à jour avec les deux clés A et B, puis signer la prochaine mise à jour après cela avec uniquement la clé B.

La signature d'un APK (ou de tout fichier JAR) avec plusieurs clés est techniquement possible, mais Google Play n'accepte plus les APK avec plusieurs signatures.

Si vous tentez de le faire, le message "Votre APK a été signé avec plusieurs certificats. Veuillez le signer avec un seul certificat et le télécharger à nouveau."


Que puis-je faire?

Vous devrez créer votre application avec un nouvel ID d'application (par exemple, passer de "com.example.myapp" à "com.example.myapp2") et créer une toute nouvelle liste sur Google Play.

Vous devrez peut-être également modifier votre code afin que les gens puissent installer la nouvelle application même si l'ancienne application est installée, par exemple, vous devez vous assurer que vous n'avez pas de fournisseurs de contenu en conflit.

Vous perdrez votre base d'installation existante, vos avis, etc., et devrez trouver un moyen d'amener vos clients existants à désinstaller l'ancienne application et à installer la nouvelle version.

Encore une fois, assurez-vous que vous disposez de sauvegardes sécurisées du fichier de clés et du ou des mots de passe que vous utilisez pour cette version.

Christopher Orr
la source
J'ai essayé la commande que vous avez donnée pour vérifier le débogage (que je cherchais en fait), mais elle renvoie une erreur indiquant que le pot contient des signatures qui n'incluent pas d'horodatage. J'ai créé mon apk en utilisant ce fil: stackoverflow.com/questions/16622843/…
CularBytes
@RageCompex Vous n'obtenez aucune sortie et seulement une erreur? Lorsque j'exécute cette commande, j'obtiens également un avertissement d'horodatage (pas une erreur). Tant que vous obtenez la sortie X.509, c'est tout ce dont vous avez besoin.
Christopher Orr
Oui, j'obtiens la sortie X.509, donc ce n'est pas un problème je suppose? Et [CertPath not validated: Path does not chain with any of the trust anchors]pas un problème de cuir? Je vois mon nom à CNdonc je suppose que je l'ai correctement signé :)
CularBytes
@RageCompex Ceci est déjà répondu dans la section "Vérifier les clés de signature utilisées".
Christopher Orr
J'ai eu une mini crise cardiaque aujourd'hui. J'ai utilisé ces lignes de commande pour comprendre le magasin de clés caché. Merci beaucoup, mec! Tu m'as sauvé ... Vraiment: D
Ajeet
11

Rien - Google indique clairement que l'application est identifiée par les clés utilisées pour la signer. Par conséquent, si vous avez perdu les clés, vous devez créer une nouvelle application.

Le rappel d'Eugene Mayevski
la source
1
@sports Ils vous avertissent. Remarquez le gros message d' avertissement rouge : developer.android.com/tools/publishing/…
Christopher Orr
2
@sports Dans tous les cas, vous pouvez publier plusieurs applications sur le même compte développeur, vous n'avez donc pas besoin de payer à nouveau.
Christopher Orr
7

Aujourd'hui, j'ai rencontré le même problème, malheureusement, j'avais deux alias dans mon fichier de clés.entrez la description de l'image ici

Krishan
la source
7

Je viens de faire que cela se produise du bleu clair. Je ne pense vraiment pas avoir changé quoi que ce soit.

Cependant, Build => Clean Projectil l'a corrigé.

Dave Hubbard
la source
1
Hmm, j'ai passé 1 semaine, j'ai fait tout mon possible. et il est temps de dire "WTF", mais c'est la seule chose qui a aidé. (J'ai également essayé d'invalider des caches qui n'ont pas aidé ..) Merci
Upsilon42
1
Cela a résolu le problème après être devenu fou pendant une heure
Boris Legovic
Merci pour cela; C'est un véritable épargnant de vie!
Ian Mbae
Je ne vois pas que cela soit lié.
Infinite Loops
Merci beaucoup!. J'ai accidentellement généré un apk signé avec un fichier de clés et des informations d'identification différents et l'ai téléchargé. Obtention de la même erreur même après le téléchargement d'apk avec le magasin de clés correct. Après une heure de création de nouvelles versions avec cache invalidé, redémarrage du studio Android et du PC, cela a finalement été corrigé.
Arun
5

Ici, je reçois la réponse à cette question. Après avoir cherché trop longtemps enfin, j'arrive à casser la clé et le mot de passe pour cela. J'oublie ma clé et mon alias aussi le fichier jks mais heureusement je connais le tas de mot de passe que j'ai mis dedans. mais trouver les bonnes combinaisons pour cela était la tâche la plus difficile pour moi.

Solution - Télécharger ceci - Plugin Keytool IUI version 2.4.1 entrez la description de l'image ici

la fenêtre apparaîtra maintenant, elle montrera le nom de l'alias ..si votre fichier jks est correct .. faites un clic droit sur l'alias et appuyez sur "voir la chaîne des certificats" .. elle montrera la clé SHA1 .. faites correspondre cette clé avec la clé que vous obtenez pendant que vous téléchargiez l'apk dans google app store ...

si cela correspond alors vous êtes avec le bon fichier jks et alias ..

maintenant j'ai de la chance d'avoir un tas de mot de passe pour correspondre .. entrez la description de l'image ici

maintenant allez à ce scrren mettez le même chemin jks .. et mot de passe (parmi le mot de passe que vous avez) mettez n'importe quel chemin dans "Fichier de certificat"

si l'écran affiche une erreur, le mot de passe ne correspond pas .. s'il ne montre aucune erreur, cela signifie que vous êtes avec le bon fichier jks. corriger l'alias et le mot de passe () maintenant avec cela, vous pouvez télécharger votre apk dans le Play Store :)

Arun Yadav
la source
vous avez perdu la clé privée et vous avez pu la récupérer de cette façon? Si la réponse est oui, est-il possible de faire un lien où télécharger l'outil? Et comment puis-je ouvrir l'application?
LS_
4

Si vous avez un fichier apk précédent avec vous (sauvegarde), utilisez jarSigner pour extraire le certificat de cette apk, puis utilisez cette clé ou utilisez keytool pour cloner ce certificat, cela peut vous aider ... Les liens utiles sont les documents jarsigner et les documents keytool .

om252345
la source
5
"..utiliser jarSigner pour extraire le certificat de cette apk" - Dites-nous comment faire?
Rubycon
14
Cela ne récupérera pas la clé privée dont vous auriez besoin pour signer à nouveau l'apk.
botteaap
L'APK doit être signé avec la même clé privée
om252345
3

Je recommande fortement Keystore Explorer ( https://keystore-explorer.org/ ) qui vous permet d'accéder à votre keystore sans avoir à le télécharger sur Google Play. De cette façon, vous pouvez résoudre le problème de saisie incorrecte de votre mot de passe.

drdiv
la source
1

Vous pouvez utiliser la nouvelle fonctionnalité de signature d'application Google Play pour générer un nouveau fichier clé.

Après mai 2017, Google Play Store ajoute une nouvelle fonctionnalité sur Play Store et c'est une bonne nouvelle pour les développeurs Android. À partir de cette fonctionnalité, le développeur peut mettre à jour son application ou Apk qui a perdu un fichier KeyStore. vous devez activer la signature de l'application google play sur la console Play Store.

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

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

Jack
la source
0

J'avais rencontré ce problème récemment, après avoir essayé différentes façons de se connecter, comme activer V1 ou V2, connecté en changeant le nom d'alias et j'ai appris pour la dernière fois que j'utilisais un fichier de stockage de clés incorrect

user2837615
la source
0

Mon erreur [idiote] était que j'ai utilisé le fichier app-debug.apk au lieu du fichier app-release.apk. Vous devez choisir "release" dans le cadre "Build Variants" lorsque vous générez un fichier APK signé. Le fichier app-release.apk doit se trouver dans le dossier "app \ release" à la racine de votre projet.

M. Marmor
la source