Як дізнатися, який магазин зберігання ключів використовувався для підписання програми?


260

У мене є додаток, який підписаний і кілька файлів зберігання ключів. Я хотів би оновити додаток, тому мені потрібно з’ясувати, який із клавіш використовувався.

Як я можу встановити відповідність того, який магазинний магазин був використаний для первинного підписання програми на різних магазинах брелоків на моїй машині?


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

Існує відкритий ключ "Консоль розробника"> "Редагувати профіль". Чи можу я ним скористатися якось, щоб допомогти собі?
xliiv

як відтворити файл зберігання брелоків, якщо його випадково видалили?
Maveň ツ

@ Maveň ツ ти не можеш. Якщо ви загубите свою магазину брелоків, тостуйте. Google представив [Підписання додатків], де вони тримаються за інформацію про підписання. [App Підписання]: support.google.com/googleplay/android-developer/answer / ...
світ

Відповіді:


401

Спочатку розпакуйте 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 має в ньому установочний dir.


1
Дякую за це. Я додав інструмент для цього в свій проект github. github.com/RichardBronosky/ota-tools/blob/master/…
Бруно Броноскі

Привіт, я не розумію цю команду ~ keytool -list -keystore my-sign-key.keystore, що таке my-sign-key.keystore
Thoman

2
@Thoman my-sign-key.keystore - це назва файлу зберігання ключів, який містить ключі, які використовуються для підпису apk
1800 ІНФОРМАЦІЯ

Дякую за це! Наше додаток було підписано PlayStore, і це призводить до відмови входу в Google. Мені довелося завантажити APK безпосередньо з PlayStore і знайти власне SHA1, щоб зареєструвати його в консолі Google Cloud.
Алвін Руслі

333

Ви можете використовувати інструмент управління ключами та сертифікатами Java 7 keytoolдля перевірки підпису магазину ключів або 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
Це має бути прийнятою відповіддю. Не потрібно розкручувати
Jacek Kwiecień

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, можливо, доведеться порівнювати за відбитками пальців.


Що таке ДН? Здебільшого у мене багато таких рядків: X.509, CN = {ім'я та прізвище} [сертифікат дійсний від {дата від} до {дата_то}]
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 всередині каталогу інструментів збирання. Наприклад: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.