Bagaimana cara mengetahui keystore mana yang digunakan untuk menandatangani aplikasi?

260

Saya memiliki aplikasi yang ditandatangani dan beberapa file keystore. Saya ingin memperbarui aplikasi, jadi saya perlu mencari tahu salah satu kunci yang digunakan.

Bagaimana saya bisa mencocokkan keystore mana yang awalnya digunakan untuk menandatangani aplikasi saya terhadap berbagai keystore yang saya miliki di mesin saya?

xliiv
sumber
Saya tidak tahu Anda dapat menemukannya atau tidak, tetapi jika Anda menandatangani aplikasi dengan kunci yang salah, konsol pengembang (tempat Anda menerbitkan aplikasi) akan memberi tahu Anda bahwa itu salah. Anda bisa mencoba semuanya.
logcat
Ada kunci publik 'konsol pengembang'> 'Edit Profil'. Bisakah saya menggunakannya untuk membantu diri saya sendiri?
xliiv
bagaimana cara membuat ulang file keystore jika terhapus secara tidak sengaja?
Maveň ツ
@ Maveň ツ kamu tidak bisa. Jika Anda kehilangan keystore Anda, Anda bersulang. Google memang memperkenalkan [Penandatanganan Aplikasi], di mana mereka menyimpan informasi penandatanganan. [Penandatanganan Aplikasi]: support.google.com/googleplay/android-developer/answer/…
mir

Jawaban:

402

Pertama, unzip APK dan ekstrak file / META-INF/ANDROID_.RSA (file ini mungkin juga CERT.RSA, tetapi seharusnya hanya ada satu file .RSA).

Kemudian terbitkan perintah ini:

keytool -printcert -file ANDROID_.RSA

Anda akan mendapatkan sidik jari sertifikat seperti ini:

     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

Kemudian gunakan keytool lagi untuk mencetak semua alias dari keystore penandatanganan Anda:

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

Anda akan mendapatkan daftar alias dan sidik jari sertifikat mereka:

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! kita sekarang dapat menentukan bahwa apk telah ditandatangani dengan keystore ini, dan dengan alias 'android_key'.

Keytool adalah bagian dari Java, jadi pastikan PATH Anda memiliki direktori instalasi Java di dalamnya.

azgolfer
sumber
1
Terima kasih untuk ini. Saya menambahkan alat untuk melakukan ini pada proyek github saya. github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky
Hai, saya tidak mengerti perintah ini ~ keytool -list -keystore my-signed-key.keystore, apa my-signed-key.keystore
Thoman
2
@Thoman my-signed-key.keystore adalah nama file keystore yang berisi kunci-kunci yang digunakan untuk menandatangani apk
1800 INFORMASI
Terima kasih banyak untuk ini! Aplikasi kami ditandatangani ulang oleh PlayStore dan itu menyebabkan Google login gagal. Saya harus mengunduh APK langsung dari PlayStore dan menemukan SHA1 yang sebenarnya untuk mendaftarkannya di konsol Google Cloud.
Alvin Rusli
335

Anda dapat menggunakan Alat Manajemen Kunci dan Sertifikat Java 7 keytooluntuk memeriksa tanda tangan keystore atau APK tanpa mengekstrak file apa pun.

Tanda tangan dari APK

keytool -printcert -jarfile app.apk

Output akan mengungkapkan sidik jari pemilik APK / penerbit dan sidik jari MD5, SHA1 dan SHA256 app.apk.

(Perhatikan bahwa -jarfileargumen tersebut diperkenalkan di Java 7; lihat dokumentasi untuk lebih jelasnya.)

Tanda tangan keystore

keytool -list -v -keystore release.jks

Output akan mengungkapkan alias (entri) dalam file keystore release.jks, dengan sidik jari sertifikat (MD5, SHA1 dan SHA256).

Jika sidik jari SHA1 antara APK dan pencocokan keystore, maka Anda dapat yakin bahwa aplikasi tersebut ditandatangani dengan kunci.

Paul Lammertsma
sumber
1
@goRGon Apakah Anda menggunakan Java 7 atau lebih baru?
Paul Lammertsma
2
@goRGon Memang, -jarfileargumen itu diperkenalkan dengan Java 7. Saya sudah memperbarui jawabannya.
Paul Lammertsma
41
Ini harus menjadi jawaban yang diterima. Tidak perlu membuka ritsleting
Jacek Kwiecień
1
Aneh bahwa Java 1.6 masih dikirimkan secara default di Mac. Saya akan merekomendasikan memperbarui ke versi yang lebih baru.
Paul Lammertsma
2
@ RichardBronosky Memang tidak benar. Saya telah menjadi pengembang Android selama lebih dari tiga tahun tanpa melakukan dev iOS. Padahal, saya setuju dengan poin utama Anda karena berbagai alasan. Java 1.6 tampaknya merupakan versi yang paling luas sejauh ini, atau setidaknya tersebar luas, dan sementara solusi yang diterima bekerja dengan baik 1.6 dan 1.7, yang satu ini hanya akan bekerja dengan 1.7, jadi saya tidak berpikir ini harus menjadi jawaban yang diterima ( namun!). (Perhatikan juga bahwa jawaban yang diterima adalah dari 2012, sedangkan yang ini dari April, 2014)
Fran Marzoa
17

Untuk membangun jawaban Paul Lammertsma, perintah ini akan mencetak nama dan tanda tangan dari semua APK dalam direktori saat ini (saya menggunakan sh karena nanti saya perlu menyalurkan output ke grep):

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

Output sampel:

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

Atau jika Anda hanya peduli tentang SHA1:

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

Output sampel:

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
sumber
Menarik! Saya telah menggunakan pendekatan yang sangat mirip dalam validasi di toko distribusi yang diinangi secara pribadi untuk memberi tahu pengguna bahwa aplikasi tersebut tidak ditandatangani dengan benar. Saya juga membuat catatan khusus untuk mengamati apakah alias kuncinya adalah "androiddebugkey" untuk menampilkan pesan dengan kata yang berbeda. Saya pikir Google Play melakukan validasi dengan cara yang sama. Saya kira Anda menggunakan ini untuk memvalidasi APK di APKMirror?
Paul Lammertsma
@ PaulLammertsma Ya, benar.
Artem Russakovskii
11

Cara yang jauh lebih mudah untuk melihat sertifikat penandatanganan:

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

Ini hanya akan menampilkan DN, jadi jika Anda memiliki dua sertifikat dengan DN yang sama, Anda mungkin harus membandingkan dengan sidik jari.

Nikolay Elenkov
sumber
Apa itu DN? Sebagian besar saya mendapat banyak baris seperti ini: X.509, CN = {firstname dan lastname} [sertifikat berlaku dari {date from} hingga {date_to}]
xliiv
DN adalah singkatan dari 'Distinguished Name', dalam kasus Anda ini adalah bagian 'CN = {firstname dan lastname}'.
Nikolay Elenkov
6

Ada banyak freeware untuk memeriksa sertifikat dan penyimpanan kunci seperti KeyStore Explorer .

Buka zip apk dan buka file META-INF / ?. RSA. ? harus CERT atau ANDROID atau mungkin sesuatu yang lain. Ini akan menampilkan semua informasi yang terkait dengan apk Anda.

Hanif
sumber
4

Anda dapat melakukan ini dengan apksigneralat yang merupakan bagian dari Android SDK:

apksigner verify --print-certs my_app.apk

Anda dapat menemukan apksigner di dalam direktori build-tools. Sebagai contoh: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Nic Dahlquist
sumber