2012-12-03 10 views
11

Mam bibliotekę skrótów MD5 kluczy publicznych używanych do podpisywania różnych słoików i mapowania do ich odpowiednich magazynów kluczy, których używamy do podpisywania różnych plików APK. To, co chciałbym móc zrobić, to określić, który magazyn kluczy został użyty do podpisania pliku APK, ale bez prób i błędów. (Niestety, wiele naszych kluczy ma podobne lub identyczne nazwy DN).Wyodrębnij surowy certyfikat X.509 ze podpisanego pliku APK lub JAR

Moje rozwiązanie, ponieważ wiem, że META-INF/FOO.RSA (lub FOO.DSA) zawiera certyfikat, miało na celu wyodrębnienie certyfikatu z plik RSA APK i bezpośrednio obliczyć wartość skrótu MD5. (Wiem, że certyfikat istnieje, ponieważ jest dostępny dla działającej aplikacji na Androida, a dokumentacja jarsignera mówi mi, że tam jest.)

Ale nie mogę znaleźć żadnego narzędzia, które dałoby mi rzeczywiste bajty certyfikatu. Mogę uzyskać DN i metadane certyfikatu, gdy używam jarsigner -verbose -verify -certs my.apk, ale to nie daje mi bajtów.

Odpowiedz

22

Extract JAR następnie użyć 'OpenSSL' do wyjścia certyfikat:

Więc zakładając 'foo.jar' znajduje się w bieżącym katalogu, zrób coś takiego:

mkdir temp 
cd temp 
jar -xvf ../foo.jar 
cd META-INF 
openssl pkcs7 -in FOO.RSA -print_certs -inform DER -out foo.cer 
1

Hexdump FOO.RSA. Ostatnie n bajtów to sam podpis, gdzie n zależy od długości klucza (np. 1024-bitowy RSA). Jeśli coś podpiszesz dwa razy tym samym kluczem, możesz zmienić pliki .RSA i zobaczyć, że zmienia się tylko ostatnie n bajtów; statyczna część pliku to cert, a zmienione bity są podpisami na mieszaniu FOO.sf. Może istnieć separator między certyfikatem i podpisem, który również trzeba będzie usunąć.

+1

Dzięki tak dużo! Właśnie działał skrypt. Dla tych, którzy są ciekawi, plik .RSA wydaje się mieć następujący wzór: * 54 bajty nieznanych informacji * 2 bajty krótkie (big-endian) o długości nadchodzącego certyfikatu * n bajtów certyfikat * nieznany –

Powiązane problemy