Comment savoir quel magasin de clés a été utilisé pour signer une application?

260

J'ai une application signée et plusieurs fichiers de clés. Je voudrais mettre à jour l'application, j'ai donc besoin de savoir laquelle des clés a été utilisée.

Comment puis-je faire correspondre le magasin de clés utilisé pour signer mon application à l'origine avec les différents magasins de clés que j'ai sur ma machine?

xliiv
la source
Je ne sais pas si vous pouvez le trouver ou non, mais si vous signez une application avec une mauvaise clé, la console développeur (où vous publiez des applications) vous dira que c'est faux. Vous pouvez tous les essayer.
logcat
Il existe une clé publique «console développeur»> «Modifier le profil». Puis-je l'utiliser de toute façon pour m'aider?
xliiv
comment recréer le fichier de clés s'il a été supprimé accidentellement?
Maveň ツ
@ Maveň ツ vous ne pouvez pas. Si vous perdez votre magasin de clés, vous êtes grillé. Google a introduit [App Signing], où ils conservent les informations de signature. [Signature d'application]: support.google.com/googleplay/android-developer/answer/…
mir

Réponses:

402

Tout d'abord, décompressez l'APK et extrayez le fichier /META-INF/ANDROID_.RSA (ce fichier peut également être CERT.RSA, mais il ne doit y avoir qu'un seul fichier .RSA).

Exécutez ensuite cette commande:

keytool -printcert -file ANDROID_.RSA

Vous obtiendrez des empreintes digitales de certificat comme ceci:

     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

Utilisez ensuite à nouveau le keytool pour imprimer tous les alias de votre magasin de clés de signature:

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

Vous obtiendrez une liste des alias et leur empreinte digitale de certificat:

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! nous pouvons maintenant déterminer que l'apk a été signé avec ce magasin de clés et avec l'alias 'android_key'.

Keytool fait partie de Java, alors assurez-vous que votre PATH contient le répertoire d'installation Java.

azgolfer
la source
1
Merci pour ça. J'ai ajouté un outil pour le faire à mon projet github. github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky
Salut , je ne comprends pas cette commande ~ keytool -list -keystore my-signature-key.keystore, quelle est ma-signature-key.keystore
Thoman
2
@Thoman my-signature-key.keystore est le nom du fichier de clés contenant les clés utilisées pour signer l'apk
1800 INFORMATION
Merci beaucoup pour cela! Notre application a été re-signée par PlayStore et cela entraîne l'échec de la connexion Google. J'ai dû télécharger l'APK directement depuis PlayStore et trouver le SHA1 réel pour l'enregistrer dans la console Google Cloud.
Alvin Rusli
335

Vous pouvez utiliser l'outil de gestion des clés et des certificats de Java 7 keytoolpour vérifier la signature d'un fichier de clés ou d'un fichier APK sans extraire aucun fichier.

Signature d'un APK

keytool -printcert -jarfile app.apk

La sortie révélera le propriétaire / émetteur de la signature et les empreintes digitales MD5, SHA1 et SHA256 du fichier APK app.apk.

(Notez que l' -jarfileargument a été introduit dans Java 7; consultez la documentation pour plus de détails.)

Signature d'un magasin de clés

keytool -list -v -keystore release.jks

La sortie révélera les alias (entrées) dans le fichier de clés release.jks, avec les empreintes digitales du certificat (MD5, SHA1 et SHA256).

Si les empreintes digitales SHA1 entre l'APK et le magasin de clés correspondent, vous pouvez être assuré que cette application est signée avec la clé.

Paul Lammertsma
la source
1
@goRGon Utilisez-vous Java 7 ou une version ultérieure?
Paul Lammertsma
2
@goRGon En effet, l' -jarfileargument a été introduit avec Java 7. J'ai mis à jour la réponse.
Paul Lammertsma
41
Cela devrait être une réponse acceptée. Aucun décompression nécessaire
Jacek Kwiecień
1
Il est étrange que Java 1.6 soit toujours livré par défaut sur Mac. Je recommanderais la mise à jour vers une version plus récente.
Paul Lammertsma
2
@RichardBronosky Ce n'est pas vrai en effet. Je suis développeur Android depuis plus de trois ans sans faire de développement iOS. Cependant, je suis d'accord avec votre point principal pour différentes raisons. Java 1.6 semble être la version la plus étendue à ce jour, ou du moins répandue, et bien que la solution acceptée fonctionne à la fois avec 1.6 et 1.7, celle-ci ne fonctionnera qu'avec 1.7, donc je ne pense pas que cela devrait être la réponse acceptée ( encore!). (Notez également que la réponse acceptée est le formulaire 2012, alors que celle-ci date d'avril 2014)
Fran Marzoa
17

Pour s'appuyer sur la réponse de Paul Lammertsma, cette commande affichera les noms et signatures de tous les fichiers APK dans le répertoire actuel (j'utilise sh car plus tard, je dois rediriger la sortie vers grep):

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

Exemple de sortie:

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

Ou si vous vous souciez juste de SHA1:

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

Exemple de sortie:

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
la source
Intéressant! J'ai utilisé une approche très similaire dans une validation sur notre magasin de distribution hébergé en privé pour informer l'utilisateur que l'application n'a pas été signée correctement. Je prends également une note spéciale pour observer si l'alias de clé est "androiddebugkey" pour afficher un message rédigé différemment. Je pense que Google Play effectue la validation de la même manière. Je suppose que vous l'utilisez pour valider les APK sur APKMirror?
Paul Lammertsma
@PaulLammertsma Oui, nous le sommes.
Artem Russakovskii
11

Un moyen beaucoup plus simple d'afficher le certificat de signature:

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

Cela ne montrera que le DN, donc si vous avez deux certificats avec le même DN, vous devrez peut-être comparer par empreinte digitale.

Nikolay Elenkov
la source
Qu'est-ce que DN? La plupart du temps, j'ai plusieurs lignes comme celle-ci: X.509, CN = {prénom et nom} [le certificat est valide du {date du} au {date_to}]
xliiv
DN signifie 'Distinguished Name', dans votre cas c'est la partie 'CN = {prénom et nom}'.
Nikolay Elenkov
6

Il existe de nombreux logiciels gratuits pour examiner les certificats et les magasins de clés tels que KeyStore Explorer .

Décompressez l'apk et ouvrez le fichier META-INF / ?. RSA. ? doit être CERT ou ANDROID ou peut être autre chose. Il affichera toutes les informations associées à votre apk.

Hanif
la source
4

Vous pouvez le faire avec l' apksigneroutil qui fait partie du SDK Android:

apksigner verify --print-certs my_app.apk

Vous pouvez trouver apksigner dans le répertoire build-tools. Par exemple: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Nic Dahlquist
la source