Jak sprawdzić, który magazyn kluczy został użyty do podpisania aplikacji?

260

Mam podpisaną aplikację i kilka plików kluczy. Chciałbym zaktualizować aplikację, więc muszę dowiedzieć się, który z kluczy został użyty.

Jak mogę dopasować, który magazyn kluczy został użyty do pierwotnego podpisania mojej aplikacji z różnymi magazynami kluczy, które mam na swoim komputerze?

Xliiv
źródło
Nie mam pojęcia, czy możesz to znaleźć, czy nie, ale jeśli podpiszesz aplikację za pomocą niewłaściwego klucza, konsola programisty (w której publikujesz aplikacje) poinformuje cię, że jest źle. Możesz wypróbować je wszystkie.
logcat
Istnieje klucz publiczny „konsola programisty”> „Edytuj profil”. Czy mogę go w jakiś sposób wykorzystać, aby sobie pomóc?
xliiv
jak odtworzyć plik kluczy, jeśli został przypadkowo usunięty?
Maveň ツ
@ Maveň ツ nie możesz. Jeśli stracisz swój magazyn kluczy, jesteś tostem. Google wprowadził [podpisywanie aplikacji], w którym trzymają się informacji podpisywania. [Podpisywanie aplikacji]: support.google.com/googleplay/android-developer/answer/…
mir

Odpowiedzi:

401

Najpierw rozpakuj APK i rozpakuj plik /META-INF/ANDROID_.RSA (ten plik może być również CERT.RSA, ale powinien istnieć tylko jeden plik .RSA).

Następnie wydaj polecenie:

keytool -printcert -file ANDROID_.RSA

Otrzymasz takie odciski palców certyfikatu:

     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

Następnie ponownie użyj narzędzia keytool, aby wydrukować wszystkie aliasy swojego magazynu kluczy podpisywania:

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

Otrzymasz listę aliasów i ich odcisk palca certyfikatu:

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! możemy teraz stwierdzić, że apk został podpisany za pomocą tego magazynu kluczy i aliasu „android_key”.

Keytool jest częścią Java, więc upewnij się, że w swojej PATH znajduje się katalog instalacji Java.

azgolfer
źródło
1
Dziękuję Ci za to. Dodałem narzędzie do robienia tego w moim projekcie github. github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky
Cześć Nie rozumiem tego polecenia ~ keytool -list -keystore my-signing-key.keystore, co to jest my-signing-key.keystore
Thoman
2
@Thoman my-signing-key.keystore to nazwa pliku kluczy zawierającego klucze używane do podpisania apk
1800 INFORMACJE
Wielkie dzięki za to! Nasza aplikacja została ponownie podpisana przez PlayStore i powoduje to niepowodzenie logowania do Google. Musiałem pobrać pakiet APK bezpośrednio z PlayStore i znaleźć właściwy SHA1, aby zarejestrować go w konsoli Google Cloud.
Alvin Rusli
333

Za pomocą Narzędzia keytooldo zarządzania kluczami i certyfikatami Java 7 można sprawdzić podpis pliku kluczy lub pliku APK bez wyodrębniania żadnych plików.

Podpis APK

keytool -printcert -jarfile app.apk

Dane wyjściowe ujawnią właściciela / wystawcę podpisu oraz odciski palców MD5, SHA1 i SHA256 pliku APK app.apk.

(Zauważ, że -jarfileargument został wprowadzony w Javie 7; więcej szczegółów znajduje się w dokumentacji ).

Podpis magazynu kluczy

keytool -list -v -keystore release.jks

Dane wyjściowe ujawnią aliasy (wpisy) w pliku kluczy release.jks, wraz z odciskami palców certyfikatu (MD5, SHA1 i SHA256).

Jeśli odciski palców SHA1 między pakietem APK a magazynem kluczy są zgodne, możesz mieć pewność, że aplikacja jest podpisana za pomocą klucza.

Paul Lammertsma
źródło
1
@goRGon Czy używasz Java 7 lub nowszej?
Paul Lammertsma
2
@goRGon Rzeczywiście, -jarfileargument został wprowadzony w Javie 7. Zaktualizowałem odpowiedź.
Paul Lammertsma
41
To powinna być zaakceptowana odpowiedź. Nie trzeba rozpakowywać
Jacek Kwiecień
1
Dziwne, że Java 1.6 jest nadal domyślnie dostarczana na komputery Mac. Polecam aktualizację do nowszej wersji.
Paul Lammertsma
2
@RichardBronosky To nie prawda. Jestem programistą Androida od ponad trzech lat bez tworzenia aplikacji na iOS. Chociaż zgadzam się z twoim głównym punktem z różnych powodów. Java 1.6 wydaje się być jak dotąd najbardziej rozszerzoną wersją, a przynajmniej rozpowszechnioną, i chociaż akceptowane rozwiązanie działa zarówno z wersją 1.6, jak i 1.7, to ta będzie działać tylko z wersją 1.7, więc nie sądzę, że powinna to być akceptowana odpowiedź ( jeszcze!). (Należy również pamiętać, że zaakceptowana odpowiedź pochodzi z 2012 r., A ta pochodzi z kwietnia 2014 r.)
Fran Marzoa,
17

Aby oprzeć się na odpowiedzi Paula Lammertsmy, to polecenie wypisze nazwy i podpisy wszystkich plików APK w bieżącym katalogu (używam sh, ponieważ później muszę przesłać dane wyjściowe do grep):

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

Przykładowe dane wyjściowe:

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

Lub jeśli zależy ci tylko na SHA1:

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

Przykładowe dane wyjściowe:

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
Artem Russakovskii
źródło
Ciekawy! Zastosowałem bardzo podobne podejście podczas sprawdzania poprawności w naszym prywatnie hostowanym sklepie dystrybucyjnym, aby poinformować użytkownika, że ​​aplikacja nie została poprawnie podpisana. Zwracam też szczególną uwagę na to, czy kluczowym pseudonimem jest „androiddebugkey”, aby wyświetlić wiadomość o innym brzmieniu. Myślę, że Google Play sprawdza poprawność w bardzo podobny sposób. Podejrzewam, że używasz tego do sprawdzania poprawności plików APK w aplikacji APKMirror?
Paul Lammertsma,
@PaulLammertsma Tak, jesteśmy.
Artem Russakovskii
11

Znacznie łatwiejszy sposób przeglądania certyfikatu podpisującego:

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

To pokaże tylko nazwę wyróżniającą, więc jeśli masz dwa certyfikaty z tą samą nazwą wyróżniającą, być może będziesz musiał porównać dane odcisków palców.

Nikolay Elenkov
źródło
Co to jest DN? Przeważnie mam wiele takich wierszy: X.509, CN = {imię i nazwisko} [certyfikat jest ważny od {data od} do {date_to}]
xliiv
DN oznacza „Distinguished Name”, w twoim przypadku jest to część „CN = {imię i nazwisko}”.
Nikolay Elenkov
6

Istnieje wiele darmowych programów do sprawdzania certyfikatów i magazynów kluczy, takich jak KeyStore Explorer .

Rozpakuj apk i otwórz plik META-INF / ?. RSA. ? będzie CERT lub ANDROID lub może być czymś innym. Wyświetli wszystkie informacje związane z aplikacją.

Hanif
źródło
4

Możesz to zrobić za pomocą apksignernarzędzia, które jest częścią zestawu Android SDK:

apksigner verify --print-certs my_app.apk

Możesz znaleźć apksigner w katalogu build-tools. Na przykład: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Nic Dahlquist
źródło