Как узнать, какое хранилище ключей было использовано для подписи приложения?

У меня есть приложение, которое подписано и несколько файлов хранилища ключей. Я хотел бы обновить приложение, поэтому мне нужно выяснить, какой из ключей был использован.

Как я могу сопоставить, какое хранилище ключей было использовано для первоначального подписания моего приложения в отношении различных хранилищ ключей, которые у меня есть на моей машине?

Ответ 1

Сначала распакуйте APK и извлеките файл /META -INF/ANDROID_.RSA(этот файл также может быть CERT.RSA, но должен быть только один .RSA файл).

Затем выполните следующую команду:

keytool -printcert -file ANDROID_.RSA

Вы получите отпечатки сертификата, например:

     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

Затем снова используйте keytool, чтобы распечатать все псевдонимы вашего хранилища ключей:

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

Вы получите список псевдонимов и их отпечаток сертификата:

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! теперь мы можем определить, что apk было подписано с этим хранилищем ключей и с псевдонимом "android_key".

Keytool является частью Java, поэтому убедитесь, что ваш PATH имеет в нем установочный каталог Java.

Ответ 2

Вы можете использовать Java 7 Key и Certificate Management Tool keytool, чтобы проверить подпись хранилища ключей или APK без извлечения каких-либо файлов.

Подпись APK

keytool -list -printcert -jarfile app.apk

На выходе будут отображаться владельцы/эмитент подписей и отпечатки пальцев MD5, SHA1 и SHA256 файла APK app.apk.

(Обратите внимание, что аргумент -jarfile был введен в Java 7; см. документацию для более подробной информации.)

Подпись хранилища ключей

keytool -list -v -keystore release.jks

На выходе будут отображаться псевдонимы (записи) в файле хранилища ключей release.jks с отпечатками сертификата (MD5, SHA1 и SHA256).

Если отпечатки SHA1 между APK и ключом совпадают, вы можете быть уверены, что это приложение подписано с помощью ключа.

Ответ 3

Чтобы построить на Paul Lammertsma ответ, эта команда будет печатать имена и подписи всех APK в текущем каталоге (я использую sh, потому что позже мне нужно передать вывод в grep):

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

Пример вывода:

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

Или, если вы просто заботитесь о SHA1:

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

Пример вывода:

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

Ответ 4

Более простой способ просмотра сертификата подписи:

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

Это отображает только DN, поэтому, если у вас есть два сертификата с одним и тем же DN, вам может потребоваться сравнить по отпечатку пальца.

Ответ 5

Существует много бесплатных образцов для проверки сертификатов и хранилищ ключей, таких как KeyStore Explorer.

Распакуйте apk и откройте файл META-INF/. RSA.? должен быть CERT или ANDROID или может быть чем-то другим. Он отобразит всю информацию, связанную с вашим apk.

Ответ 6

Вы можете сделать это с помощью инструмента apksigner, который является частью Android SDK:

apksigner verify --print-certs my_app.apk

Вы можете найти apksigner в каталоге build-tools. Например: ~/Library/Android/sdk/build-tools/29.0.1/apksigner