Как узнать, какое хранилище ключей было использовано для подписи приложения?
У меня есть приложение, которое подписано и несколько файлов хранилища ключей. Я хотел бы обновить приложение, поэтому мне нужно выяснить, какой из ключей был использован.
Как я могу сопоставить, какое хранилище ключей было использовано для первоначального подписания моего приложения в отношении различных хранилищ ключей, которые у меня есть на моей машине?
Ответы
Ответ 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