2012-07-04 12 views
175

Mam aplikację, która jest podpisana i kilka plików kluczy. Chciałbym zaktualizować aplikację, więc muszę się dowiedzieć, który z kluczy został użyty.Jak mogę się dowiedzieć, który magazyn kluczy został użyty do podpisania aplikacji?

Jak mogę dopasować, który magazyn kluczy został użyty do oryginalnego podpisania mojej aplikacji przeciwko różnym magazynom kluczy, które mam na moim komputerze?

+0

Nie mam pojęcia, czy możesz go znaleźć, czy nie, ale jeśli podpiszesz aplikację z niewłaściwym kluczem, konsola programisty (gdzie publikujesz aplikacje) powie Ci, że jest ona zła. Możesz spróbować wszystkich. – logcat

+0

Istnieje klucz publiczny "Konsola programisty"> "Edytuj profil". Czy mogę go użyć, aby pomóc sobie? – xliiv

+0

jak odtworzyć plik kluczy, jeśli został usunięty przypadkowo? – Gattsu

Odpowiedz

295

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

wydaj polecenie:

keytool -printcert -file ANDROID_.RSA 

dostaniesz palców certyfikatów tak:

 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 użyć keytool ponownie wydrukować wszystkie aliasy swojego podpisu kluczy:

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 z tym plikiem kluczy i aliasem 'android_key'.

Keytool jest częścią Java, więc upewnij się, że Twoja ścieżka PATH zawiera katalog instalacji Java.

+1

Dziękuję za to. Dodałem do tego narzędzie do mojego projektu github. https://github.com/RichardBronosky/ota-tools/blob/master/apk_fingerprint –

+0

Witam Nie rozumiem tego polecenia ~ keytool -list -keystore my-signing-key.keystore , jaki jest mój klucz podpisujący. keystore – Thoman

+2

@Thoman my-signing-key.keystore to nazwa pliku kluczy zawierającego klucze, które są używane do podpisywania apk –

11

Znacznie łatwiejszy sposób, aby zobaczyć certyfikat podpisujący:

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

To będzie tylko pokazać DN, więc jeśli masz dwie certyfikatów o tej samej średnicy DN, może trzeba porównać przez odcisk palca.

+0

Co to jest DN? Przeważnie mam wiele wierszy w ten sposób: X.509, CN = {imię i nazwisko} [certyfikat jest ważny od {data od} do {date_to}] – xliiv

+0

DN oznacza "Distinguished Name", w twoim przypadku jest to część "CN = {firstname and last}}. –

203

Możesz użyć klucza Javy i narzędzia do zarządzania certyfikatami keytool, aby sprawdzić sygnaturę pliku kluczy lub pliku APK bez wyodrębniania żadnych plików.

Podpis APK

keytool -list -printcert -jarfile app.apk 

wyjście ujawnić podpis właściciela/wystawcę i MD5, SHA1 i SHA256 odciski APK plik app.apk.

(Zauważ, że -jarfile argument ten został wprowadzony w Javie. 7; see the documentation więcej szczegółów)

Podpis kluczy

keytool -list -v -keystore release.jks 

Wyjście ujawni aliasy (pozycje) w pliku kluczy release.jks, z odciskami palców certyfikatów (MD5, SHA1 i SHA256).

Jeśli odciski palców SHA1 między plikiem APK i magazynem kluczy pasują do siebie, możesz mieć pewność, że aplikacja jest podpisana za pomocą klucza.

+1

Wystąpił błąd: 'Niedozwolona opcja: -jarfile' – goRGon

+0

@goRGon Czy używasz Java 7 lub nowszej wersji? –

+0

Nie. Java 7 przyniosła zbyt wiele problemów =) Więc działa tylko na Java 7? Czy możesz wspomnieć o tym w swojej odpowiedzi? – goRGon

13

Aby zbudować na odpowiedź Pawła Lammertsma za to polecenie będzie drukować nazwiska i podpisy wszystkich plików APK w bieżącym katalogu (Używam sh bo później muszę rury wyjście do grep):

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

wyjście

Próbka:

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 po prostu dbają o SHA1:

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

Przykładowe wyjście:

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

Interesujące! Użyłem bardzo podobnego podejścia do sprawdzania poprawności w naszym prywatnym sklepie dystrybucyjnym, aby poinformować użytkownika, że ​​aplikacja nie została poprawnie podpisana. Zwracam też szczególną uwagę, aby sprawdzić, czy kluczowym aliasem jest "androiddebugkey", aby wyświetlić komunikat inaczej sformułowany. Sądzę, że Google Play dokonuje walidacji w podobny sposób. Przypuszczam, że używasz tego do sprawdzania poprawności pakietów APK w APKMirror? –

+0

@PaulLammertsma Tak, jesteśmy. –

3

Istnieje wiele freewares do zbadania certyfikatów i kluczy sklepów takich jak KeyStore Explorer.

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

Powiązane problemy