233 votes

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

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

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

Échec du téléchargement

Vous avez téléchargé un APK qui est signé avec un certificat différent de vos APK précédents. Vous devez utiliser le même certificat.

Vos APKs existants sont signés avec le(s) certificat(s) avec empreinte(s) digitale(s) :
[ SHA1 : 89:2F:11:FE:CE:D6:CC:DF:65:E7:76:3E:DD:A7:96:4F:84:DD:BA:33 ]
et le(s) certificat(s) 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 ?

32 votes

J'ai un problème différent : J'ai essayé de mettre à jour une application mais je n'arrête pas de dire cette erreur. Le fait est que je n'ai jamais changé le keystore ! !! Qu'est-ce que je peux faire ? !?

0 votes

Comment avez-vous résolu le problème ?

0 votes

@int_32 comment tu l'as résolu ??

206voto

Igor Khomenko Points 7233

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

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

17 votes

Excellente réponse. Je n'avais jamais réalisé que si la clé est perdue, l'application ne peut pas être mise à jour. Il faut garder à l'esprit de sauvegarder la clé dans un endroit sûr.

19 votes

Ce que je ferais normalement, c'est de stocker le fichier keystore dans svn. Créez un nouveau dossier nommé credential, avec trunk/tag/branches, et stockez-y le fichier keystore. Ajoutez également un nouveau fichier .txt indiquant le fichier keystore. Le magasin de clés est aussi important que le code source . Une fois que vous l'avez perdu (ou que vous avez oublié le mot de passe), vous êtes fichu.

47 votes

S'il vous plaît NE PAS Vérifiez le mot de passe de votre keystore (ou tout autre mot de passe d'ailleurs) dans le contrôle de source, comme le dit @Krishnabhadra. Gardez le keystore et le mot de passe séparés, et le mot de passe sécurisé.

140voto

Christopher Orr Points 58514

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

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

Cependant, si vous essayez de télécharger un mise à jour qui est signé avec le keystore de débogage, vous pourrez pas voir ce message ; Google Play affichera le message indiqué dans la question, faisant référence aux empreintes SHA1.

Tout d'abord, vérifiez si vous n'avez pas signé l'application avec votre clé de débogage par erreur.


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

Recueillir 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 en utilisant les commandes suivantes, à l'aide de l'application Java keytool :

keytool -printcert -jarfile original.apk
keytool -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 éléments importants à noter ici - pour chaque APK - sont les suivants SHA1 la valeur de l'empreinte digitale, le Propriétaire et la valeur d'identité Valable du/jusqu'au dates.


Si cela keytool ne fonctionne pas (la commande -jarfile requiert Java 7), vous pouvez obtenir des informations plus basiques via l'option jarsigner commandement :

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

Malheureusement, cela ne montre pas l'empreinte SHA1, mais 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 not validated", ainsi que les avertissements concernant les chaînes de certificats ou les timestamps ; ils ne sont pas pertinents dans ce cas.

Comparez les valeurs Owner, SHA1 et Expiry entre les APKs.

  • Si le Propriétaire / X.509 la valeur d'identité est CN=Android Debug, O=Android, C=US alors vous avez signé l'APK avec votre carte de crédit. clé de débogage pas la clé de sortie originale

  • Si le SHA1 La valeur de l'empreinte digitale est différente entre les APK d'origine et de mise à jour, alors vous avez fait pas utiliser la même clé de signature pour les deux APKs

  • Si le Propriétaire / X.509 sont différentes, ou que les dates d'expiration du certificat diffèrent entre les deux APK, alors vous avez fait pas utiliser la même clé de signature pour les deux APKs

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 autre chose ne correspond pas - comme les valeurs de l'empreinte digitale - alors les certificats sont différents.


Recherchez le keystore original, vérifiez les sauvegardes.

Si les deux APKs ont des informations de certificat différentes, alors vous doit trouver le keystore original, c'est-à-dire le fichier avec la première valeur d'empreinte SHA1 que Google Play (ou keytool ) vous a dit.

Recherchez tous les fichiers keystore 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

Il suffit d'appuyer sur Enter si le mot de passe vous est demandé - vous n'avez pas nécessairement besoin de le saisir si vous voulez simplement vérifier rapidement la valeur SHA1.


Je ne peux pas trouver le keystore original n'importe où.

Si vous ne pouvez pas trouver le keystore original, vous devrez jamais être en mesure de publier toute mise à jour de cette application particulière.

Android le mentionne explicitement dans le Signature de votre demande page :

Attention : Conservez votre keystore et votre clé privée dans un endroit sûr, et assurez-vous d'en avoir des sauvegardes sécurisées. Si vous publiez une application sur Google Play et que vous 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 APK, toutes les versions suivantes doivent être signées avec la même clé.


Puis-je extraire la clé de signature originale de l'APK original ?

Non, ce n'est pas possible. L'APK ne contient que des informations publiques, et pas les informations de votre 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 mise à jour suivante avec les clés A et B, puis signer la mise à jour suivante avec la clé B uniquement.

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

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


Qu'est-ce que je peux faire ?

Vous devrez créer votre application avec un nouvel identifiant (par exemple, remplacer "com.example.myapp" par "com.example.myapp2") et créer une toute nouvelle fiche sur Google Play.

Il est possible que vous deviez également modifier votre code afin que les utilisateurs puissent installer la nouvelle application même si l'ancienne est déjà installée, par exemple en vous assurant que les fournisseurs de contenu ne sont pas en conflit.

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

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

0 votes

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 jar contient des signatures qui n'incluent pas de timestamp. J'ai créé mon apk en utilisant ce fil de discussion : stackoverflow.com/questions/16622843/

0 votes

@RageCompex Vous n'obtenez aucune sortie et seulement une erreur ? Lorsque j'exécute cette commande, j'obtiens également un avertissement sur l'horodatage (et non une erreur). Tant que vous obtenez la sortie X.509, c'est tout ce dont vous avez besoin.

0 votes

Oui, j'obtiens la sortie X.509, donc je suppose que ce n'est pas un problème ? Qu'en est-il [CertPath not validated: Path does not chain with any of the trust anchors] pas un problème non plus ? Je vois mon nom à CN donc je suppose que j'ai bien signé :)

13voto

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.

1 votes

@sports Ils faire vous avertir. Remarquez le gros rouge Avertissement message : developer.Android.com/tools/publishing/

2 votes

@sports Dans tous les cas, vous pouvez publier plus d'une application sur le même compte de développeur, vous n'avez donc pas besoin de payer à nouveau.

10voto

Dave Hubbard Points 103

Ça m'est arrivé comme ça, sans crier gare. Je ne pense vraiment pas avoir changé quoi que ce soit.

Cependant, Build => Clean Project Je l'ai réparé.

1 votes

Hmm, j'ai passé 1 semaine, fait tout ce qui était possible. et c'est le moment de dire "WTF", mais c'est la seule chose qui a aidé. (J'ai aussi essayé d'invalider les caches qui n'ont pas aidé..) Merci

1 votes

Cela a réglé le problème après une heure de folie.

0 votes

Merci pour cela ; c'est un vrai sauveur de vie !

7voto

Krishan Points 42

Aujourd'hui, j'ai rencontré le même problème, malheureusement, j'avais deux alias dans mon fichier keystore. enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X