¿Cómo puedo saber qué almacén de claves se usó para firmar una aplicación?

260

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 usó.

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

xliiv
fuente
No tengo idea de si puedes encontrarlo o no, pero si firmas la aplicación con una clave incorrecta, la consola del desarrollador (donde publicas aplicaciones) te dirá que está mal. Puedes probarlos todos.
logcat
Hay una clave pública 'consola de desarrollador'> 'Editar perfil'. ¿Puedo usarlo de alguna manera para ayudarme?
xliiv
¿Cómo volver a crear el archivo de almacén de claves si se eliminó accidentalmente?
Maveň
@ Maveň ツ no puedes. Si pierde su almacén de claves, está tostado. Google introdujo [Firma de aplicaciones], donde guardan la información de firma. [Firma de la aplicación]: support.google.com/googleplay/android-developer/answer/…
mir

Respuestas:

402

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

Luego emita este comando:

keytool -printcert -file ANDROID_.RSA

Obtendrá huellas digitales de certificados como esta:

     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

Luego, use la herramienta de claves nuevamente 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 el apk se ha firmado con este almacén de claves y con el alias 'android_key'.

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

azgolfer
fuente
1
Gracias por esto. Agregué una herramienta para hacer esto a mi proyecto github. github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky
Hola, no entiendo este comando ~ keytool -list -keystore my-firmado-clave.keystore, ¿cuál es mi-firma-clave.keystore?
Thoman
2
@Thoman my-Signature-key.keystore es el nombre del archivo de almacén de claves que contiene las claves que se utilizan para firmar el apk
1800 INFORMACIÓN
¡Muchas gracias por esto! PlayStore volvió a firmar nuestra aplicación y hace que falle el inicio de sesión de Google. Tuve que descargar el APK directamente desde PlayStore y encontrar el SHA1 real para registrarlo en la consola Google Cloud.
Alvin Rusli
335

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

Firma de un APK

keytool -printcert -jarfile app.apk

La salida revelará el propietario / emisor de la firma y las huellas digitales MD5, SHA1 y SHA256 del archivo APK app.apk.

(Tenga en cuenta que el -jarfileargumento se introdujo en Java 7; consulte la documentación para obtener 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 del almacén de claves release.jks , con las huellas digitales del certificado (MD5, SHA1 y SHA256).

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

Paul Lammertsma
fuente
1
@goRGon ¿Estás utilizando Java 7 o posterior?
Paul Lammertsma
2
@goRGon De hecho, el -jarfileargumento se introdujo con Java 7. He actualizado la respuesta.
Paul Lammertsma
41
Esta debería ser una respuesta aceptada. No es necesario descomprimir
Jacek Kwiecień
1
Es extraño que Java 1.6 todavía se envíe de forma predeterminada en Mac. Recomiendo actualizar a una versión más reciente.
Paul Lammertsma
2
@RichardBronosky Eso no es cierto de hecho. He sido desarrollador de Android durante más de tres años sin hacer desarrollo de iOS. Sin embargo, estoy de acuerdo con su punto principal por diferentes razones. Java 1.6 parece ser la versión más extendida hasta ahora, o al menos generalizada, y aunque la solución aceptada funciona con 1.6 y 1.7, esta solo funcionará con 1.7, por lo que no creo que esta sea la respuesta aceptada ( ¡todavía!). (También tenga en cuenta que la respuesta aceptada es el formulario 2012, mientras que esta es de abril de 2014)
Fran Marzoa
17

Para construir sobre la respuesta de Paul Lammertsma, este comando imprimirá los nombres y firmas de todos los APK en el directorio actual (estoy usando sh porque más tarde necesito canalizar la salida a grep):

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

Salida de 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 solo te importa SHA1:

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

Salida de muestra:

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
Artem Russakovskii
fuente
¡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 firmó correctamente. También tomo nota especial para observar si el alias clave es "androiddebugkey" para mostrar un mensaje redactado de manera diferente. Creo que Google Play realiza la validación de la misma manera. ¿Supongo que estás usando esto para validar APK en APKMirror?
Paul Lammertsma
@PaulLammertsma Sí, lo estamos.
Artem Russakovskii
11

Una forma mucho más fácil de ver el certificado de firma:

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

Esto solo mostrará el DN, por lo que si tiene dos certificados con el mismo DN, es posible que deba comparar por huella digital.

Nikolay Elenkov
fuente
¿Qué es el DN? Principalmente obtuve muchas líneas como esta: X.509, CN = {nombre y apellido} [el certificado es válido desde {fecha de} hasta {fecha_a}]
xliiv
DN significa 'Nombre distinguido', en su caso es la parte 'CN = {nombre y apellido}'.
Nikolay Elenkov
6

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

Descomprima el apk y abra el archivo META-INF /? RSA. ? será CERT o ANDROID o puede ser otra cosa. Mostrará toda la información asociada con su apk.

Hanif
fuente
4

Puede hacerlo con la apksignerherramienta que forma parte del SDK de Android:

apksigner verify --print-certs my_app.apk

Puede encontrar un apksigner dentro del directorio de herramientas de compilación. Por ejemplo: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Nic Dahlquist
fuente