Wie finde ich heraus, mit welchem ​​Keystore eine App signiert wurde?

260

Ich habe eine App, die signiert ist und mehrere Keystore-Dateien. Ich möchte die App aktualisieren, daher muss ich herausfinden, welcher der Schlüssel verwendet wurde.

Wie kann ich den Keystore, mit dem meine App ursprünglich signiert wurde, mit verschiedenen Keystores vergleichen, die ich auf meinem Computer habe?

xliiv
quelle
Ich habe keine Ahnung, ob Sie es finden können oder nicht, aber wenn Sie eine App mit einem falschen Schlüssel signieren, wird Ihnen die Entwicklerkonsole (in der Sie Apps veröffentlichen) mitteilen, dass sie falsch ist. Sie können sie alle ausprobieren.
Logcat
Es gibt einen öffentlichen Schlüssel 'Entwicklerkonsole'> 'Profil bearbeiten'. Kann ich es trotzdem benutzen, um mir selbst zu helfen?
xliiv
Wie erstelle ich die Keystore-Datei neu, wenn sie versehentlich gelöscht wurde?
Maveň ツ
@ Maveň ツ kannst du nicht. Wenn Sie Ihren Keystore verlieren, sind Sie Toast. Google hat [App Signing] eingeführt, bei dem die Signaturinformationen festgehalten werden. [App Signing]: support.google.com/googleplay/android-developer/answer/…
mir

Antworten:

402

Entpacken Sie zuerst die APK und extrahieren Sie die Datei /META-INF/ANDROID_.RSA (diese Datei kann auch CERT.RSA sein, es sollte jedoch nur eine .RSA-Datei vorhanden sein).

Geben Sie dann diesen Befehl ein:

keytool -printcert -file ANDROID_.RSA

Sie erhalten Zertifikatsfingerabdrücke wie folgt:

     MD5:  B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB
     SHA1: 16:59:E7:E3:0C:AA:7A:0D:F2:0D:05:20:12:A8:85:0B:32:C5:4F:68
     Signature algorithm name: SHA1withRSA

Verwenden Sie dann das Keytool erneut, um alle Aliase Ihres Signatur-Keystores auszudrucken:

keytool -list -keystore my-signing-key.keystore

Sie erhalten eine Liste der Aliase und ihres Zertifikatfingerabdrucks:

android_key, Jan 23, 2010, PrivateKeyEntry,
Certificate fingerprint (MD5): B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB

Voila! wir können nun feststellen, dass die apk mit diesem keystore und mit dem alias 'android_key' signiert wurde.

Keytool ist Teil von Java. Stellen Sie daher sicher, dass in Ihrem PATH das Java-Installationsverzeichnis enthalten ist.

Azgolfer
quelle
1
Danke dafür. Ich habe meinem Github-Projekt ein Tool hinzugefügt, um dies zu tun. github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky
Hallo, ich verstehe diesen Befehl nicht ~ keytool -list -keystore mein-signieren-key.keystore, was ist mein-signieren-key.keystore
Thoman
2
@Thoman my-testing-key.keystore ist der Name der Keystore-Datei, die die Schlüssel enthält, die zum Signieren der apk verwendet werden
1800 INFORMATION
Vielen Dank dafür! Unsere App wurde von PlayStore neu signiert und führt dazu, dass die Google-Anmeldung fehlschlägt. Ich musste die APK direkt aus dem PlayStore herunterladen und die tatsächliche SHA1 finden, um sie in der Google Cloud-Konsole zu registrieren.
Alvin Rusli
335

Sie können das Schlüssel- und Zertifikatverwaltungstool von Java 7 verwenden keytool, um die Signatur eines Schlüsselspeichers oder einer APK zu überprüfen, ohne Dateien zu extrahieren.

Unterschrift einer APK

keytool -printcert -jarfile app.apk

Die Ausgabe zeigt den Signaturbesitzer / -aussteller sowie die Fingerabdrücke MD5, SHA1 und SHA256 der APK-Datei app.apk.

(Beachten Sie, dass das -jarfileArgument in Java 7 eingeführt wurde. Weitere Informationen finden Sie in der Dokumentation .)

Unterschrift eines Keystores

keytool -list -v -keystore release.jks

Die Ausgabe zeigt die Aliase (Einträge) in der Keystore-Datei release.jksmit den Zertifikat-Fingerabdrücken (MD5, SHA1 und SHA256).

Wenn die SHA1-Fingerabdrücke zwischen der APK und dem Keystore übereinstimmen, können Sie sicher sein, dass diese App mit dem Schlüssel signiert ist.

Paul Lammertsma
quelle
1
@goRGon Verwenden Sie Java 7 oder höher?
Paul Lammertsma
2
@goRGon In der Tat wurde das -jarfileArgument mit Java 7 eingeführt. Ich habe die Antwort aktualisiert.
Paul Lammertsma
41
Dies sollte eine akzeptierte Antwort sein. Kein Entpacken erforderlich
Jacek Kwiecień
1
Es ist seltsam, dass Java 1.6 auf dem Mac immer noch standardmäßig ausgeliefert wird. Ich würde empfehlen, auf eine neuere Version zu aktualisieren.
Paul Lammertsma
2
@ RichardBronosky Das stimmt in der Tat nicht. Ich bin seit mehr als drei Jahren ein Android-Entwickler ohne iOS-Entwickler. Ich stimme jedoch aus verschiedenen Gründen Ihrem Hauptpunkt zu. Java 1.6 scheint die bislang am weitesten verbreitete oder zumindest weit verbreitete Version zu sein, und während die akzeptierte Lösung sowohl mit 1.6 als auch mit 1.7 funktioniert, funktioniert diese nur mit 1.7, daher denke ich nicht, dass dies die akzeptierte Antwort sein sollte ( noch!). (Beachten Sie auch, dass die akzeptierte Antwort aus dem Jahr 2012 stammt, während diese aus dem April 2014 stammt.)
Fran Marzoa
17

Um auf der Antwort von Paul Lammertsma aufzubauen, druckt dieser Befehl die Namen und Signaturen aller APKs im aktuellen Verzeichnis (ich verwende sh, weil ich später die Ausgabe an grep weiterleiten muss):

find . -name "*.apk" -exec echo "APK: {}" \; -exec sh -c 'keytool -printcert -jarfile "{}"' \;

Beispielausgabe:

APK: ./com.google.android.youtube-10.39.54-107954130-minAPI15.apk
Signer #1:

Signature:

Owner: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Issuer: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Serial number: 4934987e
Valid from: Mon Dec 01 18:07:58 PST 2008 until: Fri Apr 18 19:07:58 PDT 2036
Certificate fingerprints:
         MD5:  D0:46:FC:5D:1F:C3:CD:0E:57:C5:44:40:97:CD:54:49
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
         SHA256: 3D:7A:12:23:01:9A:A3:9D:9E:A0:E3:43:6A:B7:C0:89:6B:FB:4F:B6:79:F4:DE:5F:E7:C2:3F:32:6C:8F:99:4A
         Signature algorithm name: MD5withRSA
         Version: 1

APK: ./com.google.android.youtube_10.40.56-108056134_minAPI15_maxAPI22(armeabi-v7a)(480dpi).apk
Signer #1:

Signature:

Owner: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Issuer: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Serial number: 4934987e
Valid from: Mon Dec 01 18:07:58 PST 2008 until: Fri Apr 18 19:07:58 PDT 2036
Certificate fingerprints:
         MD5:  D0:46:FC:5D:1F:C3:CD:0E:57:C5:44:40:97:CD:54:49
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
         SHA256: 3D:7A:12:23:01:9A:A3:9D:9E:A0:E3:43:6A:B7:C0:89:6B:FB:4F:B6:79:F4:DE:5F:E7:C2:3F:32:6C:8F:99:4A
         Signature algorithm name: MD5withRSA
         Version: 1

Oder wenn Sie sich nur für SHA1 interessieren:

find . -name "*.apk" -exec echo "APK: {}" \; -exec sh -c 'keytool -printcert -jarfile "{}" | grep SHA1' \;

Beispielausgabe:

APK: ./com.google.android.youtube-10.39.54-107954130-minAPI15.apk
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
APK: ./com.google.android.youtube_10.40.56-108056134_minAPI15_maxAPI22(armeabi-v7a)(480dpi).apk
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
Artem Russakovskii
quelle
Interessant! Ich habe einen sehr ähnlichen Ansatz bei einer Validierung in unserem privat gehosteten Distributionsspeicher verwendet, um den Benutzer darüber zu informieren, dass die App nicht korrekt signiert wurde. Ich achte auch besonders darauf, ob der Schlüsselalias "androiddebugkey" ist, um eine Nachricht mit einem anderen Wortlaut anzuzeigen. Ich denke, Google Play führt die Validierung auf die gleiche Weise durch. Ich nehme an, Sie verwenden dies, um APKs auf APKMirror zu validieren.
Paul Lammertsma
@PaulLammertsma Ja, das sind wir.
Artem Russakovskii
11

Viel einfachere Möglichkeit, das Signaturzertifikat anzuzeigen:

jarsigner.exe -verbose -verify -certs myapk.apk

Dies zeigt nur den DN an. Wenn Sie also zwei Zertifikate mit demselben DN haben, müssen Sie möglicherweise anhand des Fingerabdrucks vergleichen.

Nikolay Elenkov
quelle
Was ist DN? Meistens habe ich viele Zeilen wie diese: X.509, CN = {Vor- und Nachname} [Zertifikat ist gültig von {Datum von} bis {Datum_zu}]
xliiv
DN steht für 'Distinguished Name', in Ihrem Fall ist es der Teil 'CN = {Vor- und Nachname}'.
Nikolay Elenkov
6

Es gibt viele Freewares, um die Zertifikate und Schlüsselspeicher zu untersuchen, z. B. KeyStore Explorer .

Entpacke die apk und öffne die META-INF /?. RSA-Datei. ? soll CERT oder ANDROID sein oder kann etwas anderes sein. Es werden alle Informationen angezeigt, die mit Ihrer apk verknüpft sind.

Hanif
quelle
4

Sie können dies mit dem apksignerTool tun , das Teil des Android SDK ist:

apksigner verify --print-certs my_app.apk

Sie finden apksigner im Verzeichnis build-tools. Beispielsweise: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Nic Dahlquist
quelle