Come faccio a sapere quale keystore è stato utilizzato per firmare un'app?


260

Ho un'app firmata e diversi file di archivio chiavi. Vorrei aggiornare l'app, quindi devo scoprire quale delle chiavi è stata utilizzata.

Come posso abbinare quale keystore è stato usato originariamente per firmare la mia app con vari keystore che ho sul mio computer?


Non ho idea di trovarla o meno, ma se firmi un'app con chiave sbagliata, la console per gli sviluppatori (dove pubblichi le app) ti dirà che è sbagliata. Puoi provarli tutti.
logcat,

Esiste una chiave pubblica "console per sviluppatori"> "Modifica profilo". Posso usarlo comunque per aiutare me stesso?
xliiv,

come ricreare il file keystore se è stato eliminato accidentalmente?
Maveň ツ

@ Maveň ツ non puoi. Se perdi il tuo keystore, sei un brindisi. Google ha introdotto [App Signing], dove si aggrappano alle informazioni sulla firma. [Firma app]: support.google.com/googleplay/android-developer/answer/…
mir

Risposte:


402

Innanzitutto, decomprimere l'APK ed estrarre il file /META-INF/ANDROID_.RSA (questo file può anche essere CERT.RSA, ma dovrebbe esserci solo un file .RSA).

Quindi emettere questo comando:

keytool -printcert -file ANDROID_.RSA

Otterrai le impronte digitali del certificato in questo modo:

     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

Quindi utilizzare di nuovo il keytool per stampare tutti gli alias del keystore di firma:

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

Otterrai un elenco di alias e la loro impronta digitale del certificato:

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

Ecco! ora possiamo determinare che l'apk è stato firmato con questo keystore e con l'alias 'android_key'.

Keytool fa parte di Java, quindi assicurati che il tuo PATH contenga una directory di installazione Java.


1
Grazie per questo. Ho aggiunto uno strumento per farlo al mio progetto github. github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky

Ciao, non capisco questo comando ~ keytool -list -keystore my-signing-key.keystore, cos'è my-signing-key.keystore
Thoman

2
@Thoman my-signing-key.keystore è il nome del file keystore contenente le chiavi utilizzate per firmare l'apk
1800 INFORMAZIONI

Grazie mille per questo! La nostra app è stata nuovamente firmata da PlayStore e causa un errore di accesso a Google. Ho dovuto scaricare l'APK direttamente dal PlayStore e trovare lo SHA1 effettivo per registrarlo nella console di Google Cloud.
Alvin Rusli,

335

È possibile utilizzare lo strumento di gestione chiavi e certificati di Java 7 keytoolper verificare la firma di un keystore o di un APK senza estrarre alcun file.

Firma di un APK

keytool -printcert -jarfile app.apk

L'output rivelerà il proprietario / emittente della firma e le impronte digitali MD5, SHA1 e SHA256 del file APK app.apk.

(Notare che l' -jarfileargomento è stato introdotto in Java 7; consultare la documentazione per maggiori dettagli.)

Firma di un keystore

keytool -list -v -keystore release.jks

L'output rivelerà gli alias (voci) nel file keystore release.jks, con le impronte digitali del certificato (MD5, SHA1 e SHA256).

Se le impronte digitali SHA1 tra l'APK e il keystore corrispondono, puoi stare certo che l'app è firmata con la chiave.


1
@goRGon Stai usando Java 7 o versioni successive?
Paul Lammertsma,

2
@goRGon Effettivamente, il -jarfile argomento è stato introdotto con Java 7. Ho aggiornato la risposta.
Paul Lammertsma,

41
Questa dovrebbe essere una risposta accettata. Non è necessario decomprimere
Jacek Kwiecień,

1
È strano che Java 1.6 sia ancora distribuito per impostazione predefinita su Mac. Consiglierei l'aggiornamento a una versione più recente.
Paul Lammertsma

2
@RichardBronosky Non è proprio vero. Sono uno sviluppatore Android da più di tre anni senza fare sviluppo iOS. Tuttavia, sono d'accordo con il tuo punto principale per diversi motivi. Java 1.6 sembra essere la versione più estesa finora, o almeno diffusa, e mentre la soluzione accettata funziona sia con 1.6 che con 1.7, questa funzionerà solo con 1.7, quindi non credo che questa dovrebbe essere la risposta accettata ( ancora!). (Nota anche che la risposta accettata è dal 2012, mentre questa è di aprile 2014)
Fran Marzoa,

17

Per basarsi sulla risposta di Paul Lammertsma, questo comando stamperà i nomi e le firme di tutti gli APK nella directory corrente (sto usando sh perché in seguito ho bisogno di reindirizzare l'output a grep):

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

Uscita campione:

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

O se ti interessa solo SHA1:

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

Uscita campione:

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

Interessante! Ho usato un approccio molto simile in una convalida sul nostro negozio di distribuzione ospitato privatamente per informare l'utente che l'app non è stata firmata correttamente. Prendo anche nota speciale per osservare se l'alias chiave è "androiddebugkey" per visualizzare un messaggio con parole diverse. Penso che Google Play esegua la convalida più o meno allo stesso modo. Suppongo che lo stai usando per convalidare gli APK su APKMirror?
Paul Lammertsma,

@PaulLammertsma Sì, lo siamo.
Artem Russakovskii,

11

Modo molto più semplice per visualizzare il certificato di firma:

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

Questo mostrerà solo il DN, quindi se hai due certificati con lo stesso DN, potresti dover confrontare con l'impronta digitale.


Che cos'è DN? Principalmente ho ottenuto molte righe come questa: X.509, CN = {nome e cognome} [il certificato è valido da {data da} a {data_to}]
xliiv il

DN sta per "Distinguished Name", nel tuo caso è la parte "CN = {firstname and lastname}".
Nikolay Elenkov il

6

Esistono molti software gratuiti per esaminare i certificati e i keystore come KeyStore Explorer .

Decomprimi l'apk e apri il file META-INF / ?. RSA. ? deve essere CERT o ANDROID o può essere qualcos'altro. Mostrerà tutte le informazioni associate al tuo apk.


4

Puoi farlo con lo apksignerstrumento che fa parte dell'SDK di Android:

apksigner verify --print-certs my_app.apk

Puoi trovare apksigner nella directory di build-tools. Per esempio: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.