2012-12-03 13 views
11

Ho una libreria di hash MD5 di chiavi pubbliche utilizzate per firmare vari jar e una mappatura ai rispettivi keystore che usiamo per firmare diversi APK. Quello che mi piacerebbe essere in grado di fare è identificare quale keystore è stato usato per firmare un APK, ma senza usare tentativi ed errori. (Inoltre, purtroppo, molte delle nostre chiavi condividono DN simili o identici.)Estratto certificato X.509 non elaborato da un APK o JAR firmato

La mia soluzione, perché so che il META-INF/FOO.RSA (o FOO.DSA) contiene il certificato, era estrarre il certificato da il file RSA dell'APK e calcolare direttamente l'hash MD5. (So ​​che il certificato è lì perché è accessibile a un'applicazione Android in esecuzione, e la documentazione di jarsigner mi dice che è lì.)

Ma non riesco a trovare nessuno strumento che mi dà i byte effettivi del certificato. Posso ottenere il DN e i metadati del certificato quando uso jarsigner -verbose -verify -certs my.apk, ma questo non mi dà i byte.

risposta

22

Estrarre il JAR poi usare 'OpenSSL' per l'emissione del certificato:

Quindi, supponendo 'foo.jar' è nella directory corrente, fare qualcosa di simile:

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. Gli ultimi n byte sono la firma stessa, dove n dipende dalla lunghezza della chiave (ad es. 1024 bit RSA). Se si firma qualcosa due volte con la stessa chiave, è possibile diffare i file .RSA e vedere che solo gli ultimi n byte cambiano; la parte statica del file è il certificato ei bit che cambiano sono la firma sull'hash di FOO.sf. Potrebbe esserci un delimitatore tra il certificato e la firma che dovresti rimuovere.

+1

Grazie mille! Ho appena scritto una sceneggiatura. Per coloro che sono curiosi, il file .RSA sembra avere il seguente schema: * 54 byte di informazioni sconosciute * a 2 byte breve (big-endian) con la lunghezza del certificato imminente * i n byte di il certificato * sconosciuto –

Problemi correlati