2012-07-04 24 views
175

Tengo una aplicación que está firmada y varios archivos de almacén de claves. Me gustaría actualizar la aplicación, así que necesito saber cuál de las claves se utilizó.¿Cómo averiguo qué almacén de claves se utilizó para firmar una aplicación?

¿Cómo puedo comparar qué almacén de claves se utilizó para firmar mi aplicación originalmente en varios almacenes de claves que tengo en mi máquina?

+0

No tengo idea, puedes encontrarlo o no, pero si firmas la aplicación con la tecla incorrecta, la consola del desarrollador (donde publicas las aplicaciones) te dirá que es incorrecta. Puedes probarlos todos. – logcat

+0

Hay una clave pública 'consola de desarrollador'> 'Editar perfil'. ¿Puedo usarlo de todos modos para ayudarme a mí mismo? – xliiv

+0

cómo volver a crear el archivo de almacén de claves si se eliminó accidentalmente? – Gattsu

Respuesta

295

Primero, descomprima la APK y extraiga el archivo /META-INF/ANDROID_.RSA (este archivo también puede ser CERT.RSA, pero solo debe haber un archivo .RSA).

A continuación, emita este comando:

keytool -printcert -file ANDROID_.RSA 

Usted recibirá las huellas digitales de certificado así:

 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 

A continuación, utilice la herramienta de claves de nuevo para imprimir todos los alias de su almacén de claves de firma:

keytool -list -keystore my-signing-key.keystore 

Obtendrá una lista de alias y su huella digital de certificado:

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! ahora podemos determinar que la aplicación ha sido firmada con este almacén de claves y con el alias 'android_key'.

Keytool es parte de Java, así que asegúrese de que su RUTA tenga el directorio de instalación de Java en ella.

+1

Gracias por esto. Agregué una herramienta para hacer esto en mi proyecto github. https://github.com/RichardBronosky/ota-tools/blob/master/apk_fingerprint –

+0

Hola, no entiendo este comando ~ keytool -list -keystore my-signing-key.keystore , cuál es my-signing-key. keystore – Thoman

+2

@Thoman my-signing-key.keystore es el nombre del archivo keystore que contiene las claves que se utilizan para firmar el apk –

11

manera mucho más fácil para ver el certificado de firma:

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

Esto sólo mostrará el DN, así que si usted tiene dos CERT con el mismo DN, puede que tenga que comparar por huella digital.

+0

¿Qué es DN? sobre todo me tiene muchas líneas de este tipo: X.509, CN = {} Nombre y Apellido [certificado es válido desde la fecha de {} {a} date_to] – xliiv

+0

DN significa 'nombre distinguido', en su caso se trata de la parte 'CN = {firstname and lastname}'. –

203

Puede usar la herramienta de administración de claves y certificados de Java 7 keytool para verificar la firma de un almacén de claves o un archivo APK sin extraer ningún archivo.

Firma de un APK

keytool -list -printcert -jarfile app.apk 

La salida revelará la firma propietario/emisor y MD5, SHA1 y SHA256 huellas dactilares de la APK presentar app.apk.

(Tenga en cuenta que el argumento -jarfile se introdujo en Java 7;. see the documentation para más detalles)

Firma de un almacén de claves

keytool -list -v -keystore release.jks 

La salida revelará los alias (entradas) en el archivo de almacén de claves release.jks, con las huellas digitales del certificado (MD5, SHA1 y SHA256).

Si las huellas dactilares SHA1 entre el APK y el almacén de claves coinciden, entonces puede estar seguro de que esa aplicación está firmada con la clave.

+1

Obtuvo un error: 'Opción ilegal: -jarfile' – goRGon

+0

@goRGon ¿Está utilizando Java 7 o posterior? –

+0

No. Java 7 trajo demasiados problemas =) ¿Entonces solo funciona en Java 7? ¿Podría mencionarlo en su respuesta? – goRGon

13

Para construir sobre la respuesta de Pablo Lammertsma, este comando se imprimirán los nombres y las firmas de todos los archivos APK en el directorio actual (estoy usando sh porque después tengo que canalizar la salida a grep):

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

salida

muestra:

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 

O si sólo se preocupan por SHA1:

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

Salida de ejemplo:

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

¡Interesante! He utilizado un enfoque muy similar en una validación en nuestra tienda de distribución alojada de forma privada para informar al usuario que la aplicación no se ha firmado correctamente. También tomo nota especial para observar si el alias clave es "androiddebugkey" para mostrar un mensaje con una redacción diferente. Creo que Google Play hace la validación de la misma manera. ¿Supongo que estás usando esto para validar los APK en APKMirror? –

+0

@PaulLammertsma Sí, lo somos. –

3

Hay muchos programas gratuitos para examinar los certificados y almacenes de claves, tales como KeyStore Explorer.

Descomprime la aplicación y abre el archivo META-INF/?. RSA. ? debe ser CERT o ANDROID o puede ser otra cosa. Mostrará toda la información asociada con tu apk.

Cuestiones relacionadas