Determinar el certificado de firma de un APK

He creado un APK firmado de Eclipse para Android. Quiero saber qué tipo de certificado RSA se utiliza en ese APK firmado como RSA-1024 o RSA 2048.

¿Cómo puedo saber que desde el archivo APK?

EDIT Título cambiado de "¿Qué certificado RSA se utiliza en APK firmado en Eclipse? ¿Cómo saber tamaño de clave RSA (1024/2048)?"

¿Qué certificado RSA se utiliza en APK firmado en Eclipse?

Bajo Eclipse durante la depuración (y en ausencia de otra clave), firmará con la clave predeterminada de depuración de Android.

Eclipse lo crea si no está presente. La clave se agrega a debug.keystore , con una contraseña de tienda y clave de android . Consulte Firmar en modo de depuración en la firma de Android de su aplicación .


Usted puede firmar con algunas herramientas, incluyendo keytool o jarsigner . Pero creo que usted necesita utilizar otra herramienta para examinar el certificado en el APK.

Puede utilizar OpenSSL para volcar los bits relevantes desde su PKCS # 7, pero necesita extraer manualmente los archivos relevantes del APK.


Para firmar, uso jarsigner cuando trabajo de la línea de comando. Por ejemplo, en Windows con la clave de depuración:

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

Eclipse se comporta de forma similar bajo el IDE.


No puede utilizar jarsigner para volcar la información. Por ejemplo, lo siguiente imprimirá el nombre subjectPublicKeyInfo , pero no imprimirá el bloque subjectPublicKeyInfo :

 $ jarsigner -verbose -certs -verify Test.apk 

Del mismo modo, no puede utilizar keytool porque no imprime el bloque subjectPublicKeyInfo :

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

Para determinar el certificado en el APK, debe examinar un par de archivos. Los archivos de interés se encuentran en el directorio META_INF del APK. Las firmas están en un archivo .SF junto con un archivo .RSA (o .DSA archivo .DSA ) para cada firmante. El archivo .RSA del firmante (o el archivo .DSA ) son sólo formato PKCS # 7.

Digo "las firmas están en …" porque los elementos individuales del APK están firmados, y no el APK entero. Así que classes.dex obtiene firmado, AndroidManifest.xml obtiene firmado, cada icono en res/ obtiene firmado, etc

Nota: mientras jarsigner admite varias firmas, Android solo admite un firmante (si lo recuerdo correctamente).


He aquí un ejemplo con un APK llamado CrackMe.apk que usa OpenSSL.

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

A continuación, descomprima el APK. Es sólo un archivo ZIP con metadatos adicionales en META-INF/ .

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

A continuación, eche un vistazo en el directorio META-INF .

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

Las firmas están en CERT.SF , y el firmante está en CERT.RSA .

Por último, utilice OpenSSL para analizar 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 

También puede usar -pubkey cuando utilice x509 para extraer el formato PEM de clave pública:

 $ 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----- 

Si está interesado en el código de validación APK de Android, consulte collectCertificates de PackageParser.java .

  • ¿Cómo enviar solicitudes de proxy a api.twitter.com incluyendo certificados SSL?
  • Cordova App en Android usando SSL enviando multipart / form-data causes Error de la aplicación de rack: # <EOFError: cuerpo de contenido incorrecto>
  • SSLHandshakeException: Handshake falló en Android N / 7.0
  • SSL Broken Pipe
  • Android ssl: javax.net.ssl.SSLPeerUnverifiedException: Ningún certificado de igual (una vez más)
  • SSLSocket se bloquea en getInputStream cuando el dispositivo android está en wifi
  • Android kSOAP2 Certificados SSL auto-firmados "Requisitos de seguridad no cumplidos - No hay cabecera de seguridad en el mensaje"
  • ¿Cómo puedo solucionar el problema "No se han encontrado certificados: la aplicación Chrome ha solicitado un certificado" Edición de Android / Google Chrome
  • ¿Cómo anular la lista de cifrado enviada al servidor por Android cuando se utiliza HttpsURLConnection?
  • ¿Cómo comprobar la huella digital del certificado SSL auto-firmado en Android?
  • Error 'No peer certificate' en Android 2.3 pero NO en 4
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.