Die apk muss mit den gleichen zertifikaten wie die vorherige version signiert sein

200

Ich hatte meine App vor einiger Zeit auf Google Play hochgeladen (damals, als sie Android Market hieß).

Heute habe ich die App aktualisiert, aber den vorherigen Keystore gelöscht und einen neuen erstellt.
Beim Hochladen heißt es, dass die APK mit denselben Zertifikaten wie die vorherige Version signiert sein muss:

Upload fehlgeschlagen

Sie haben eine APK hochgeladen, die mit einem anderen Zertifikat als Ihre vorherigen APKs signiert ist. Sie müssen dasselbe Zertifikat verwenden.

Ihre vorhandenen APKs sind mit den Zertifikaten mit Fingerabdruck (en) signiert:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
und die zum Signieren der von Ihnen hochgeladenen APK verwendeten Zertifikate haben Fingerabdrücke:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

Ich habe dieses Zertifikat jedoch nicht und möchte die Anwendung nicht löschen und erneut veröffentlichen, da sie aktive Benutzer hat.

Was kann ich tun, um meine App mit einem neuen Zertifikat zu signieren?

artem
quelle
26
Ich habe ein anderes Problem: Ich habe versucht, eine App zu aktualisieren, aber ich sage immer wieder diesen Fehler. Tatsache ist, ich habe den Keystore nie geändert !!! Was kann ich tun?!?
Mariux
Wie hast du gelöst?
Elizabeth
@ int_32 wie lösst du es?
Amit Sharma

Antworten:

187

Nichts. Lesen Sie die Dokumentation: Veröffentlichen von Updates in Android Market

Stellen Sie vor dem Hochladen der aktualisierten Anwendung sicher, dass Sie die Attribute android: versionCode und android: versionName im Element der Manifestdatei erhöht haben. Außerdem muss der Paketname identisch sein und die APK-Datei muss mit demselben privaten Schlüssel signiert sein. Wenn der Paketname und das Signaturzertifikat nicht mit denen der vorhandenen Version übereinstimmen, betrachtet Market sie als neue Anwendung und bietet sie den Benutzern nicht als Update an.

Rubycon
quelle
13
Gute Antwort. Ich habe nie bemerkt, dass die App nicht aktualisiert werden kann, wenn der Schlüssel verloren geht. Beachten Sie, dass der Schlüssel an einem sicheren Ort gesichert werden muss.
Peter Knego
18
Normalerweise würde ich die Keystore-Datei in svn speichern. Legen Sie einen neuen Ordner mit dem Namen "Anmeldeinformationen" zusammen mit "Trunk / Tag / Zweige" ab und speichern Sie die Keystore-Datei dort. Fügen Sie außerdem eine neue TXT-Datei hinzu, die die Keystore-Datei angibt. Keystore ist genauso wichtig wie der Quellcode . Sobald Sie es verloren haben (oder das Passwort vergessen haben), werden Sie geschraubt.
Krishnabhadra
42
Bitte überprüfen Sie NICHT Ihr Keystore-Passwort (oder irgendwelche Passwörter für diese Angelegenheit) in der Quellcodeverwaltung, wie @Krishnabhadra sagt. Halten Sie den Keystore und das Passwort getrennt und das Passwort sicher.
Christopher Orr
1
Was?! Aber es hat mir nur gesagt, dass mein Schlüssel zu alt ist, also habe ich ihn gelöscht und einen neuen erstellt, jetzt verstehe ich das!?
2
@iwayneo Das Build-System hat Ihnen möglicherweise mitgeteilt, dass Ihr Debug- Schlüssel zu alt war. Dies ist jedoch mit einem Release- Schlüssel sehr unwahrscheinlich , da Google Play Schlüssel ablehnen sollte, die vor Oktober 2033 ablaufen .
Christopher Orr
126

Haben Sie versehentlich mit dem Debug-Schlüssel unterschrieben?

Mit Google Play können Sie keine App veröffentlichen, die mit Ihrem Debug-Keystore signiert ist. Wenn Sie versuchen, eine solche APK hochzuladen, schlägt Google Play mit der Meldung "Sie haben eine APK hochgeladen, die im Debug-Modus signiert wurde. Sie müssen Ihre APK im Release-Modus signieren" fehl.

Wenn Sie jedoch versuchen, ein Update hochzuladen, das mit dem Debug-Keystore signiert ist, wird diese Meldung nicht angezeigt. Google Play zeigt die in der Frage angezeigte Nachricht an, die sich auf SHA1-Fingerabdrücke bezieht.

Überprüfen Sie zunächst, ob Sie die App versehentlich mit Ihrem Debug-Schlüssel signiert haben.


Wie überprüfe ich, welche Signaturschlüssel verwendet wurden?

Sammeln Sie die Informationen aus der APK

Mit den folgenden Befehlen können Sie mithilfe von Java überprüfen, mit welchen Zertifikaten das ursprüngliche APK und das Update-APK signiert wurden keytool:

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

Hier sehen Sie detaillierte Informationen darüber, wie eine APK signiert wurde, zum Beispiel:

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

Die wichtigen Teile, die hier zu beachten sind - für jede APK - sind der SHA1- Fingerabdruckwert, der Eigentümeridentitätswert und das Gültigkeitsdatum von / bis .


Wenn dieser keytoolBefehl nicht funktioniert (für die -jarfileOption ist Java 7 erforderlich), können Sie über den folgenden jarsignerBefehl weitere grundlegende Informationen abrufen:

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

Dies zeigt leider nicht den SHA1-Fingerabdruck, sondern die X.509-Eigentümeridentität sowie die Ablaufdaten des Zertifikats. Beispielsweise:

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]

Sie können jede Meldung "CertPath nicht validiert" sowie Warnungen zu Zertifikatketten oder Zeitstempeln ignorieren. Sie sind in diesem Fall nicht relevant.

Vergleichen Sie die Werte für Eigentümer, SHA1 und Ablauf zwischen den APKs

  • Wenn der Identitätswert Owner / X.509 lautet CN=Android Debug, O=Android, C=US, haben Sie die APK mit Ihrem Debug-Schlüssel und nicht mit dem ursprünglichen Release-Schlüssel signiert

  • Wenn sich der SHA1- Fingerabdruckwert zwischen den ursprünglichen und den aktualisierten APKs unterscheidet, haben Sie nicht für beide APKs denselben Signaturschlüssel verwendet

  • Wenn die Identitätswerte für Eigentümer / X.509 unterschiedlich sind oder die Ablaufdaten des Zertifikats zwischen den beiden APKs unterschiedlich sind, haben Sie nicht für beide APKs denselben Signaturschlüssel verwendet

Beachten Sie, dass selbst wenn die Owner / X.509-Werte zwischen den beiden Zertifikaten identisch sind, dies nicht bedeutet, dass die Zertifikate identisch sind - wenn etwas anderes nicht übereinstimmt - wie die Fingerabdruckwerte -, dann unterscheiden sich die Zertifikate.


Suchen Sie nach dem ursprünglichen Schlüsselspeicher und überprüfen Sie die Sicherungen

Wenn die beiden APKs unterschiedliche Zertifikatinformationen haben, müssen Sie den ursprünglichen Schlüsselspeicher finden, dh die Datei mit dem ersten SHA1-Fingerabdruckwert, den Google Play (oder keytool) Ihnen mitgeteilt hat.

Durchsuchen Sie alle Keystore-Dateien, die Sie auf Ihrem Computer und in allen vorhandenen Backups finden, bis Sie die mit dem richtigen SHA1-Fingerabdruck haben:

keytool -list -keystore my-release.keystore

Drücken EnterSie einfach, wenn Sie zur Eingabe des Passworts aufgefordert werden. Sie müssen es nicht unbedingt eingeben, wenn Sie nur schnell den SHA1-Wert überprüfen möchten.


Ich kann den ursprünglichen Schlüsselspeicher nirgendwo finden

Wenn Sie den ursprünglichen Schlüsselspeicher nicht finden können, können Sie niemals Updates für diese bestimmte App veröffentlichen.

Android erwähnt dies ausdrücklich auf der Seite Signieren Ihrer Anwendung :

Warnung: Bewahren Sie Ihren Schlüsselspeicher und Ihren privaten Schlüssel an einem sicheren Ort auf und stellen Sie sicher, dass Sie über sichere Sicherungen verfügen. Wenn Sie eine App bei Google Play veröffentlichen und dann den Schlüssel verlieren, mit dem Sie Ihre App signiert haben, können Sie keine Updates für Ihre App veröffentlichen, da Sie immer alle Versionen Ihrer App mit demselben Schlüssel signieren müssen.

Nach der ersten Veröffentlichung einer APK müssen alle nachfolgenden Versionen mit genau demselben Schlüssel signiert werden.


Kann ich den ursprünglichen Signaturschlüssel aus der ursprünglichen APK extrahieren?

Nein das ist nicht möglich. Die APK enthält nur öffentliche Informationen und nicht Ihre privaten Schlüsselinformationen.


Kann ich auf einen neuen Signaturschlüssel migrieren?

Nein. Selbst wenn Sie das Original finden, können Sie keine APK mit Schlüssel A signieren, dann das nächste Update mit beiden Schlüsseln A und B signieren und das nächste Update danach nur mit Schlüssel B signieren.

Das Signieren einer APK (oder einer beliebigen JAR-Datei) mit mehreren Schlüsseln ist technisch möglich, Google Play akzeptiert jedoch keine APKs mit mehreren Signaturen mehr.

Wenn Sie dies versuchen, wird die Meldung "Ihre APK wurde mit mehreren Zertifikaten signiert. Bitte signieren Sie sie nur mit einem Zertifikat und laden Sie sie erneut hoch." Angezeigt.


Was kann ich tun?

Sie müssen Ihre App mit einer neuen Anwendungs-ID erstellen (z. B. von "com.example.myapp" in "com.example.myapp2" ändern) und einen brandneuen Eintrag bei Google Play erstellen.

Möglicherweise müssen Sie auch Ihren Code ändern, damit Benutzer die neue App installieren können, auch wenn sie die alte App installiert haben. Sie müssen beispielsweise sicherstellen, dass Sie keine widersprüchlichen Inhaltsanbieter haben.

Sie verlieren Ihre vorhandene Installationsbasis, Überprüfungen usw. und müssen einen Weg finden, Ihre bestehenden Kunden dazu zu bringen, die alte App zu deinstallieren und die neue Version zu installieren.

Stellen Sie erneut sicher, dass Sie über sichere Sicherungen des für diese Version verwendeten Schlüsselspeichers und Kennworts verfügen.

Christopher Orr
quelle
Ich habe den von Ihnen angegebenen Befehl ausprobiert, um nach Debug zu suchen (nach dem ich tatsächlich gesucht habe), aber es wird ein Fehler zurückgegeben, dass das JAR Signaturen enthält, die keinen Zeitstempel enthalten. Ich habe meine apk mit diesem Thread erstellt: stackoverflow.com/questions/16622843/…
CularBytes
@RageCompex Erhalten Sie keine Ausgabe und nur einen Fehler? Wenn ich diesen Befehl ausführe, erhalte ich auch eine Zeitstempelwarnung (kein Fehler). Solange Sie die X.509-Ausgabe erhalten, ist das alles, was Sie brauchen.
Christopher Orr
Ja, ich bekomme die X.509-Ausgabe, also ist es wohl kein Problem? Was [CertPath not validated: Path does not chain with any of the trust anchors]ist mit kein Problem? Ich sehe meinen Namen bei, CNalso habe ich ihn wohl richtig unterschrieben :)
CularBytes
@RageCompex Dies wird bereits im Abschnitt "Überprüfen Sie die verwendeten Signaturschlüssel" beantwortet.
Christopher Orr
Ich hatte heute einen kleinen Herzinfarkt. Ich habe diese Befehlszeilen verwendet, um den versteckten Keystore herauszufinden. Vielen Dank Alter! Du hast mich gerettet ... Wirklich: D
Ajeet
11

Nichts - Google sagt deutlich, dass die Anwendung durch die zum Signieren verwendeten Schlüssel identifiziert wird. Wenn Sie die Schlüssel verloren haben, müssen Sie eine neue Anwendung erstellen.

Eugene Mayevskis Rückruf
quelle
1
@sports Sie tun Sie warnen. Beachten Sie die große rote Warnmeldung : developer.android.com/tools/publishing/…
Christopher Orr
2
@sports In jedem Fall können Sie mehr als eine App auf demselben Entwicklerkonto veröffentlichen, sodass Sie nicht erneut bezahlen müssen.
Christopher Orr
7

Heute hatte ich das gleiche Problem, leider hatte ich zwei Aliase in meiner Keystore-Datei.Geben Sie hier die Bildbeschreibung ein

Krishan
quelle
7

Ich hatte dies gerade aus heiterem Himmel geschehen. Ich glaube wirklich nicht, dass ich etwas geändert habe.

Es wurde jedoch Build => Clean Projectbehoben.

Dave Hubbard
quelle
1
Hmm, ich habe 1 Woche verbracht und alles Mögliche getan. und es ist Zeit, "WTF" zu sagen, aber es ist das einzige, was geholfen hat. (Ich habe auch versucht, Caches ungültig zu machen, die nicht geholfen haben ..) Danke
Upsilon42
1
Dies
behebt
Danke dafür; Es ist ein echter Lebensretter!
Ian Mbae
Ich sehe nicht, dass dies verwandt ist.
Endlosschleifen
Vielen Dank!. Ich habe versehentlich eine signierte apk mit verschiedenen Keystore-Dateien und Anmeldeinformationen generiert und hochgeladen. Habe auch nach dem Hochladen von apk mit dem richtigen Keystore den gleichen Fehler erhalten. Nach einer Stunde des Erstellens neuer Releases mit ungültigem Cache, Neustart von Android Studio und PC wurde dies endgültig behoben.
Arun
5

Hier bekomme ich die Antwort auf diese Frage. Nachdem ich zu lange gesucht habe, kann ich endlich den Schlüssel und das Passwort dafür knacken. Ich vergesse meinen Schlüssel und Alias ​​auch die JKS-Datei, aber zum Glück kenne ich die Menge an Passwörtern, die ich eingegeben habe. Aber die richtigen Kombinationen dafür zu finden, war für mich die schwierigste Aufgabe.

Lösung - Laden Sie dieses Plugin für Keytool IUI Version 2.4.1 herunter Geben Sie hier die Bildbeschreibung ein

Das Fenster wird geöffnet, in dem der Aliasname angezeigt wird. Wenn Ihre JKS-Datei korrekt ist. Klicken Sie mit der rechten Maustaste auf den Alias ​​und klicken Sie auf "Zertifikatskette anzeigen". Es wird der SHA1-Schlüssel angezeigt. Ordnen Sie diesen Schlüssel dem Schlüssel zu, den Sie erhalten während du die apk im google app store hochgeladen hast ...

Wenn es übereinstimmt, haben Sie die richtige JKS-Datei und den richtigen Alias.

Jetzt habe ich Glück, dass ich ein paar passende Passwörter habe. Geben Sie hier die Bildbeschreibung ein

Gehen Sie jetzt zu diesem Skript und geben Sie den gleichen JKS-Pfad ein. Geben Sie das Passwort (unter dem Passwort, das Sie haben) einen beliebigen Pfad in "Zertifikatdatei" ein.

Wenn auf dem Bildschirm ein Fehler angezeigt wird, stimmt das Kennwort nicht überein. Wenn kein Fehler angezeigt wird, bedeutet dies, dass Sie über die richtige JKS-Datei verfügen. korrekter Alias ​​und Passwort () jetzt damit kannst du deine apk im play store hochladen :)

Arun Yadav
quelle
Sie haben den privaten Schlüssel verloren und konnten ihn auf diese Weise abrufen? Wenn die Antwort Ja lautet, können Sie dann einen Link erstellen, wo Sie das Tool herunterladen können? Und wie öffne ich die App?
LS_
4

Wenn Sie eine vorherige Apk-Datei bei sich haben (Backup), verwenden Sie jarSigner, um das Zertifikat aus diesem Apk zu extrahieren. Verwenden Sie dann diesen Schlüssel oder Keytool, um dieses Zertifikat zu klonen. Dies kann hilfreich sein. Hilfreiche Links sind Jarsigner-Dokumente und Keytool-Dokumente .

om252345
quelle
5
"..Verwenden Sie jarSigner, um das Zertifikat aus dieser Apk zu extrahieren" - Sagen Sie uns, wie das geht?
Rubycon
14
Dadurch wird der private Schlüssel nicht wiederhergestellt, den Sie benötigen, um die apk erneut zu signieren.
Botteaap
Apk muss mit demselben privaten Schlüssel
signiert sein
3

Ich empfehle den Keystore Explorer ( https://keystore-explorer.org/ ), mit dem Sie auf Ihren Keystore zugreifen können, ohne ihn auf Google Play hochladen zu müssen. Auf diese Weise können Sie Fehler beheben, wenn Sie Ihr Passwort falsch eingeben.

drdiv
quelle
1

Sie können die neue Funktion der Google Play App-Signatur verwenden, um eine neue Schlüsseldatei zu generieren.

Nach Mai 2017 hat der Google Play Store eine neue Funktion im Play Store hinzugefügt und es sind gute Nachrichten für Android-Entwickler. Über diese Funktion kann der Entwickler seine App oder Apk aktualisieren, die eine KeyStore-Datei verloren haben. Sie müssen die Google Play App-Signatur auf der Play Store-Konsole aktivieren.

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

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

Jack
quelle
0

Ich war kürzlich mit diesem Problem konfrontiert, nachdem ich verschiedene Anmeldemethoden wie "Aktivieren von V1" oder "V2" ausprobiert hatte , mich durch Ändern des Aliasnamens angemeldet hatte und zuletzt festgestellt hatte, dass ich eine falsche Schlüsselspeicherdatei verwende

user2837615
quelle
0

Mein [dummer] Fehler war, dass ich die Datei app-debug.apk anstelle der Datei app-release.apk verwendet habe. Sie müssen "Freigabe" im Rahmen "Varianten erstellen" auswählen, wenn Sie signierte APK generieren. Die Datei app-release.apk sollte sich im Ordner "app \ release" in Ihrem Projektstamm befinden.

M. Marmor
quelle