web-dev-qa-db-fra.com

Puis-je signer un fichier .apk avec un certificat différent de celui fourni?

Si j'ai un apk, est-ce que je peux supprimer la signature en cours et comment le signer avec un fichier .keystore différent tout en maintenant l'installation de l'application?

Mise à jour : J'ai réussi à le faire fonctionner avec la solution de Jorgesys. Là où je me suis planté avant, c'est que j'ai décompressé le fichier .apk puis le rippé après avoir supprimé le dossier META-INF et modifié l'extension de fichier en .apk. Ce que j’aurais dû faire, c’est tout simplement de l’ouvrir avec Winzip et de supprimer le dossier à l’intérieur de Winzip.

40
Anton

essaye ça

1) Changez l’extension de votre .apk en .Zip

2) Ouvrez et supprimez le dossier META-INF.

3) changer l'extension en .apk

4) Utilisez jarsigner et zipalign avec votre nouveau magasin de clés.

j'espère que ça aide

67
Elenasys

Si vous cherchez une solution rapide, vous pouvez utiliser un script open-source apk-resigner ou l'outil apksigner de Google.

   ./signapk.sh application.apk keystore key-pass alias
  • Une solution encore plus simple consiste à utiliser l'outil la ligne de commande apksigner de Google} disponible dans les versions 24.0.3 et supérieures.
apksigner sign --ks release.jks application.apk

Vous pouvez trouver plus d'informations sur apksigner tool sur le site du développeur Android. 

https://developer.Android.com/studio/command-line/apksigner.html

25
Fatih

Signature pour publication: $ 1.apk -> $ 1_release.apk " GeneralMills & GoogleApps # 2012 Étape 1: Suppression de toute signature précédente Modifiez l'extension de votre .apk en .Zip Ouvrez et supprimez le dossier META-INF Changez l’extension en .apk Ou .__ Commande: • Zip [originalapk] Exemple: • Zip "$ 1" .apk -d 

Étape 2: Signature avec release.keystore .. Commande: • jarsigner –verbose –keystore [fichier de clés] –signedjar [unalignapk] [originalapk] nom_alias Exemple: • • C:\Program Files\Java\jdk1.6.0_43\bin> jarsigner -verbose -keystore version.keystore -signedjar "$ 1" _unaligned.apk "$ 1" version .apk

Étape 3: alignement de la commande .__: • zipalign -f 4 [unalignapk] [releaseapk] Exemple: • C:\Users\G535940\Téléchargements\adt-bundle-windows-x86\adt -bundle-windows-x86\sdk\aussi ls> zipalign -f 4 "$ 1" _unaligned.apk "$ 1" _release.apk

Étape 4: nettoyage de Commande: • rm 4 [unalignapk] Exemple: • rm "$ 1" _unaligned.apk

Des commandes supplémentaires pourraient aider:

  1. Pour générer une nouvelle clé avec keytool Keytool -genkey -alias -keystore 

  2. Pour lister les clés Keytool -list -keystore 

Commande pour générer un keyhash pour les fonctionnalités de Facebook

Commande: • keytool -exportcert -alias nom_alias -keystore [fichier_fichier] | openssl sha1 -binary | openssl base64

Exemple: • C:\Program Files\Java\jdk1.6.0_43\bin> keytool -exportcert -alias release -keyst Ou release.keystore | opens l sha1 -binary | openssl base64

Remarque: Pour signer nos apks, nous avons rétrogradé JDK de la mise à jour 1.7 à 1.6.0_43.

Motif: À partir de JDK 7, l’algorithme de signature par défaut a été modifié. Vous devez donc spécifier les algorithmes de signature et de synthèse (-sigalg et -digestalg) lorsque vous signez un APK.

Commande: Jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [fichier de stockage de clés] [Originalapk] nom_alias

7
Harsha.Vaswani
Zip -d my_application.apk META-INF/\*
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
6
kreker

Notez que si vous utilisez schéma de signature v2 (que vous utiliserez automatiquement si vous utilisez build-tools 24.0.3+ en AS), vous ne pouvez pas simplement supprimer le dossier META-INF de l'APK car la v2 ajoute ses données de signature à un bloc méta Zip.

Le nouvel apksigner de Google introduit dans build-tools 24.03 (Android 7) est toutefois capable de démissionner des APK. Vous pouvez simplement répéter la commande de signature pour signer avec un nouveau magasin de clés/certificat (les anciens seront supprimés).

apksigner sign --ks keystore.jks signed_app.apk

Prise sans scrupule: si vous voulez un outil plus simple capable de signer plusieurs apks et d'avoir une meilleure sortie de journal, utilisez: https://github.com/patrickfav/uber-apk-signer _ (utilise l'apksigner.jar de Google en arrière-plan)

6
patrickf

Toutes les solutions ci-dessus fonctionnent. Juste une note pourquoi cela n'a pas fonctionné pour vous lorsque vous avez compressé à nouveau: 

Certains fichiers du fichier .apk doivent rester stockés (compression à 0%). En effet, Android utilisera le mappage de mémoire (mmap) pour lire le contenu sans le décompresser en mémoire. Ces fichiers sont .ogg et certaines des icônes.

3
gilm

En supposant que vos clés soient stockées dans keys.keystore, vous pouvez exécuter:

$ keytool -list -keystore keys.keystore
Your keystore contains 1 entry

your_key_alias, Jan 3, 2013, PrivateKeyEntry, 
Certificate fingerprint (SHA1): 8C:C3:6A:DC:7E:B6:12:F1:4C:D5:EE:F1:AE:17:FB:90:89:73:50:53

pour déterminer le pseudonyme de votre clé. Puis lancez:

Zip -d your_app.apk "META-INF/*"
jarsigner -verbose -keystore keys.keystore \
   -sigalg MD5withRSA -digestalg SHA1 -sigfile CERT \
   your_app.apk your_key_alias

re-signer your_app.apk avec la clé nommée your_key_alias.

L'option supplémentaire -sigfile CERT semble être nécessaire à partir de JDK 8.

0
Phil Calvin