2012-07-04 3 views
175

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

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

+0

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

+0

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

+0

как воссоздать файл хранилища ключей, если он случайно удалился? – Gattsu

ответ

295

Сначала распакуйте 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.

+1

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

+0

Привет, я не понимаю эту команду ~ keytool -list -keystore my-signed-key.keystore , что такое мой ключ-ключ. keystore – Thoman

+2

@Thoman my-sign-key.keystore - это имя файла хранилища ключей, содержащего ключи, которые используются для подписи apk –

11

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

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

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

+0

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

+0

DN означает 'Distinguished Name', в вашем случае это часть CN = {firstname и lastname}. –

203

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

Подписи к APK

keytool -list -printcert -jarfile app.apk 

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

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

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

keytool -list -v -keystore release.jks 

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

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

+1

Получена ошибка: 'Незаконная опция: -jarfile' – goRGon

+0

@goRGon Используете ли вы Java 7 или новее? –

+0

Нет. В Java 7 появилось слишком много проблем =) Так что это работает только на Java 7? Не могли бы вы упомянуть об этом в своем ответе? – goRGon

13

Чтобы построить на ответ Пола Lammertsma, эта команда выводит имена и подписи всех APK, в текущей директории (я использую ш, потому что позже мне нужно трубы выход к 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 
+0

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

+0

@PaulLammertsma Да, мы. –

3

Есть много freewares для изучения сертификатов и хранилищ ключей, таких как KeyStore Explorer.

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

Смежные вопросы