2014-06-14 12 views
7

Ho creato un APK firmato da Eclipse per Android. Voglio sapere quale tipo di certificato RSA è usato in quell'APK firmato come RSA-1024 o RSA 2048.Determinazione del certificato di firma da un APK

Come lo saprei dal file APK?

MODIFICA titolo cambiato da "Quale certificato RSA viene utilizzato nel firmato APK in Eclipse? Come sapere la dimensione della chiave RSA (1024/2048)?"

+0

Perché hai bisogno di saperlo? Inoltre, perché non cerchi semplicemente il sito web degli sviluppatori Android invece di fare una domanda qui? – Squonk

+0

Stiamo sviluppando app in Android nativo e Action Script. Stiamo ricevendo errore di Open SSL da Google. In Action Script abbiamo selezionato una opzione del certificato RSA. Quindi vogliamo sapere quale certificato è utilizzato in Android nativo. Grazie. :) –

+0

Generate il certificato che include una coppia di chiavi come da istruzioni sul sito Android. Quindi dovresti sapere la risposta. –

risposta

7

Quale certificato RSA viene utilizzato nell'APK firmato in Eclipse?

In Eclipse durante il debug (e in assenza di un'altra chiave), si firma con la chiave di debug Android predefinita.

Eclipse lo crea se non è presente. La chiave viene aggiunta a debug.keystore, con un negozio e password chiave di android. Vedi Accesso alla modalità di debug su Android Signing Your Application.


È possibile iscriversi con un paio di strumenti, tra cui keytool o jarsigner. Ma credo che sia necessario utilizzare un altro strumento per esaminare il certificato nell'APK.

È possibile utilizzare OpenSSL per eseguire il dump dei bit rilevanti dal suo PKCS # 7, ma è necessario estrarre manualmente i file pertinenti dall'APK.


per la firma, io uso jarsigner quando si lavora da riga di comando. Ad esempio, in Windows con il codice di debug:

jarsigner -verbose -keystore C:\Users\<user>\.android\debug.keystore \ 
    -storepass android -keypass android -digestalg SHA1 \ 
    -sigalg SHA1withRSA <package name>.apk androiddebugkey 

Eclipse esegue simile per voi sotto l'IDE.


È non uso jarsigner possibile per scaricare le informazioni. Ad esempio, il seguente sarà stampare il nome distinto, ma non lo farà stampa il blocco subjectPublicKeyInfo:

$ jarsigner -verbose -certs -verify Test.apk 

Allo stesso modo, è non può uso keytool perché non stampare il blocco subjectPublicKeyInfo sia :

$ keytool -printcert -file META-INF/CERT.RSA 

Per determinare il certificato nel APK, è n per vedere un paio di file. I file di interesse si trovano nella directory META_INF dell'APK. Le firme si trovano in un file .SF insieme a un file .RSA (o al file .DSA) per ciascun firmatario. Il file .RSA del firmatario (o il file .DSA) è solo in formato PKCS # 7.

Dico "le firme sono in ..." perché i singoli elementi dell'APK sono firmati e non l'intero APK.Così classes.dex ottiene firmato, AndroidManifest.xml ottiene firmato, ogni icona nel res/ viene firmato, ecc

Nota: mentre jarsigner supporta firme multiple, Android supporta solo un firmatario (se ricordo bene).


Ecco un esempio con un APK chiamato CrackMe.apk utilizzando OpenSSL.

$ mkdir APK-test 
$ mv CrackMe.apk APK-test 
$ cd APK-test 

Quindi decomprimere l'APK. È solo un file ZIP con metadati aggiuntivi in ​​META-INF/.

$ unzip -a CrackMe.apk 
$ ls 
AndroidManifest.xml META-INF    res 
CrackMe.apk   classes.dex   resources.arsc 

Avanti, date un'occhiata nella directory META-INF.

$ cd META-INF/ 
$ ls 
CERT.RSA CERT.SF MANIFEST.MF 

Le firme sono in CERT.SF, e il firmatario è in CERT.RSA.

Infine, utilizzare OpenSSL per analizzare CERT.RSA.

$ openssl pkcs7 -in CERT.RSA -inform DER -print_certs | openssl x509 -text -noout 
Certificate: 
    Data: 
     Version: 3 (0x2) 
     Serial Number: 1346030704 (0x503acc70) 
    Signature Algorithm: sha1WithRSAEncryption 
     Issuer: C=US, ST=NY, L=New York, O=Unknown, OU=Unknown, CN=Example, LLC 
     Validity 
      Not Before: Aug 27 01:25:04 2012 GMT 
      Not After : Dec 5 01:25:04 2035 GMT 
     Subject: C=US, ST=NY, L=New York, O=Unknown, OU=Unknown, CN=Example, LLC 
     Subject Public Key Info: 
      Public Key Algorithm: rsaEncryption 
       Public-Key: (3072 bit) 
       Modulus: 
        00:8d:a8:9a:34:84:d5:72:4f:e8:e7:69:78:e4:17: 
        13:93:e8:c5:23:a0:93:a7:f8:6c:58:3d:f0:ed:30: 
        ... 
        c1:2d:5e:9f:a4:79:56:19:7d:26:4d:27:6a:3e:26: 
        c0:fd:6a:ed:24:e9:62:80:73:8d 
       Exponent: 65537 (0x10001) 
    Signature Algorithm: sha1WithRSAEncryption 
     80:c0:ac:a5:65:13:f3:2d:dd:d5:71:82:7c:2e:72:63:72:cf: 
     76:49:4b:09:3c:12:e7:d6:9b:3d:53:8b:d4:e0:9c:ff:f2:d6: 
     ... 
     80:4d:9b:15:3f:82:1a:72:b2:4b:fd:05:2b:e7:36:f0:43:98: 
     80:b7:8f:6c:fd:64 

È inoltre possibile utilizzare -pubkey quando si utilizza x509 per estrarre il formato PEM chiave pubblica:

$ openssl pkcs7 -in CERT.RSA -inform DER -print_certs | openssl x509 -noout -pubkey 
-----BEGIN PUBLIC KEY----- 
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAjaiaNITVck/o52l45BcT 
k+jFI6CTp/hsWD3w7TAoGMA4RyH1pNcLD3ZZLXqdCPGKzKf107YhmiSp9K3DALG+ 
AHorHroKsnmGJFXglIEOLAq7gBVrfxOiBAxr0HW4MLXXGMvr2Asq4AkJAbFFmApU 
5I3bGv3DCApHBbH6B10V5gTT0VzbkxHAejqNJVIHBmi6ueKLKh5ytJeRZufgD3ZX 
+uEszGfJrD48woXkqSlCOyxHSi4PWyHLm95OXYkvlBSudNt5q9yDuy+KkJgrSHLC 
jwxISkM2JzEoWYhqNqRgosBv6pg16+97YPeE6tHoG6dHazjCClhr5oZxw/7t6969 
8rZ8m/fcLf3cOtcApqOFhCViq0ddADrOxMD2Qsp/xHx1kUg7eprE6dOEvQKr4oT5 
oBiJkOStnAQFWRw/GDFTqpvDsYSOKn64/1cJ/+NEeLw4y+HCTMcNAsPknBQlXxNc 
hzX0zSqrJ+vBLV6fpHlWGX0mTSdqPibA/WrtJOligHONAgMBAAE= 
-----END PUBLIC KEY----- 

Se interessato al codice di validazione APK Android, vedi collectCertificates da PackageParser.java.