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


260

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

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


Я понятия не имею, можете вы найти это или нет, но если вы подпишете приложение с неправильным ключом, консоль разработчика (где вы публикуете приложения) скажет вам, что это неправильно. Вы можете попробовать их все.
logcat

Существует открытый ключ «консоль разработчика»> «Редактировать профиль». Могу ли я использовать его, чтобы помочь себе?
XLIV

Как восстановить файл хранилища ключей, если он был удален случайно?
Maveň ツ

@ Maveň ツ ты не можешь. Если вы потеряете хранилище ключей, вы - тост. Google ввел [Подписание приложения], где они держат информацию о подписи. [Подписание приложения]: support.google.com/googleplay/android-developer/answer/…
mir

Ответы:


402

Сначала разархивируйте 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

Вуаля! Теперь мы можем определить, что apk был подписан этим хранилищем ключей и псевдонимом «android_key».

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


1
Спасибо тебе за это. Я добавил инструмент для этого в свой проект на github. github.com/RichardBronosky/ota-tools/blob/master/…
Бруно Броноски

Привет, я не понимаю эту команду ~ keytool -list -keystore my-signature-key.keystore, что такое my-signature-key.keystore
Томан

2
@Thoman my-signature-key.keystore - это имя файла хранилища ключей, содержащего ключи, которые используются для подписи apk
1800 ИНФОРМАЦИЯ

Большое спасибо за это! Наше приложение было переподписано PlayStore, и это приводит к сбою входа в Google. Мне пришлось скачать APK прямо из PlayStore и найти актуальный SHA1, чтобы зарегистрировать его в консоли Google Cloud.
Элвин Русли,

335

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

Подпись APK

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


1
@goRGon Вы используете Java 7 или более позднюю версию?
Пол Ламмерцма

2
@goRGon Действительно, -jarfileаргумент был введен в Java 7. Я обновил ответ.
Пол Ламмерцма

41
Это должен быть принятый ответ. Не нужно расстегивать молнию
Яцек Квецень

1
Странно, что Java 1.6 по-прежнему поставляется по умолчанию на Mac. Я бы порекомендовал обновить его до более поздней версии.
Пол Ламмерцма

2
@RichardBronosky Это действительно не так. Я был разработчиком Android более трех лет, не занимаясь разработкой iOS. Хотя я согласен с вашей основной точкой зрения по разным причинам. Java 1.6 кажется самой расширенной версией на данный момент или, по крайней мере, широко распространенной, и хотя принятое решение работает как с 1.6, так и с 1.7, оно будет работать только с 1.7, поэтому я не думаю, что это должен быть принятый ответ ( все же!). (Также обратите внимание, что принятым ответом является форма 2012, в то время как этот - с апреля 2014 г.)
Fran Marzoa

17

Чтобы построить ответ Пола Ламмерцма, эта команда напечатает имена и подписи всех 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

Интересный! Я использовал очень похожий подход при проверке нашего частного дистрибутивного хранилища, чтобы информировать пользователя о том, что приложение не было подписано правильно. Я также обращаю особое внимание на то, что псевдоним ключа «androiddebugkey» отображает сообщение с другим названием. Я думаю, что Google Play выполняет валидацию во многом таким же образом. Я полагаю, вы используете это для проверки APK на APKMirror?
Пол Ламмерцма

@PaulLammertsma Да, мы.
Артем Руссаковский

11

Намного проще посмотреть сертификат подписи:

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

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


Что такое DN? В основном я получил много строк, подобных этому: X.509, CN = {имя и фамилия} [сертификат действителен с {дата от} до {date_to}]
xliiv

DN означает «Отличительное имя», в вашем случае это часть «CN = {имя и фамилия}».
Николай Еленков

6

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

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


4

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

apksigner verify --print-certs my_app.apk

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.