Могу ли я повторно подписать .apk с другим сертификатом, чем тот, с которым он пришел? - PullRequest
42 голосов
/ 16 июля 2010

Если у меня есть apk, могу ли я удалить текущую подпись и кое-как переподписать ее другим файлом .keystore и при этом установить приложение?

Обновление : мне удалосьчтобы заставить его работать с решением Jorgesys, и где я раньше запутался, это то, что я разархивировал .apk, затем разархивировал его после удаления папки META-INF и изменил расширение файла обратно на .apk.Что я должен был сделать, так это просто открыть его с помощью winzip и удалить папку внутри winzip.

Ответы [ 7 ]

67 голосов
/ 16 июля 2010

попробуйте

1) Измените расширение вашего .apk на .zip

2) Откройте и удалите папку META-INF

3) Измените расширение на .apk

4) Используйте jarsigner и zipalign с вашим новым хранилищем ключей.

надеюсь, это поможет

26 голосов
/ 22 апреля 2013

Если вы ищете быстрое решение, вы можете использовать скрипт apk-resigner с открытым исходным кодом или инструмент apksigner от Google

  • Скрипт с открытым исходным кодом apk-resigner https://github.com/onbiron/apk-resigner

    Все, что вам нужно сделать, это скачать скрипт и просто набрать:

   ./signapk.sh application.apk keystore key-pass alias
  • В качестве альтернативы, еще более простое решение, вы можете использовать Google apksigner инструмент командной строки , который доступен в ревизии 24.0.3 и выше.
apksigner sign --ks release.jks application.apk

Более подробную информацию об инструменте apksigner вы можете найти на сайте разработчика Android.

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

8 голосов
/ 18 января 2016
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
7 голосов
/ 08 апреля 2013

Подписка на выпуск: $ 1.apk -> $ 1_release.apk "GeneralMills & GoogleApps # 2012 Шаг 1. Удаление любой предыдущей подписи Измените расширение вашего .apk на .zip Откройте и удалите папку META-INF Измените расширение на.apk Или команда: • zip [originalapk] Пример: • zip "$ 1" .apk -d

Шаг 2: Подписание с помощью release.keystore .. Команда: • jarsigner –verbose –keystore [keystorefile] –signedjar [unalignedapk] [originalapk] alias_name Пример: • C: \ Program Files \ Java \ jdk1.6.0_43 \ bin> jarsigner -verbose -keystore release.keystore -signedjar "$ 1" _unaligned.apk "$ 1" .apk release

Шаг 3. Команда выравнивания: • zipalign -f 4 [unalignedapk] [releaseapk] Пример: • C: \ Users \ G535940 \ Downloads \ adt-bundle-windows-x86 \ adt-bundle-windows-x86 \ sdk \ tools> zipalign -f 4 "$ 1" _unaligned.apk "$ 1" _release.apk

Шаг 4: Команда очистки: • rm 4 [unalignedapk] Пример: • rm "$ 1" _unaligned.apk

Дополнительные команды могут помочь:

  1. Создать новый ключ с помощью keytool keytool -genkey -alias -keystore

  2. Для получения списка ключей keytool -list -keystore

Команда для созданияключ для функций Facebook

Команда: • keytool -exportcert -alias alias_name -keystore [keystorefile] |openssl sha1 -binary |openssl base64

Пример: • C: \ Program Files \ Java \ jdk1.6.0_43 \ bin> keytool -exportcert -alias release -keyst ore release.keystore | открывает l sha1 -binary |openssl base64

Примечание. Чтобы подписать наши apks, мы понизили JDK с 1.7 до 1.6.0_43.

Причина: Начиная с JDK 7, изменился алгоритм подписи по умолчанию, требующий указатьалгоритмы подписи и дайджеста (-sigalg и -digestalg) при подписании APK.

Команда: jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorefile] [originalapk] alias_name

6 голосов
/ 18 ноября 2016

Обратите внимание, что если вы используете v2 схему подписи (что вы будете делать автоматически, если вы используете build-tools 24.0.3+ в AS), вы не сможете просто удалить папку META-INF из APK, так как v2 добавляет ее подписывание данных в метаблок zip.

Google новый apksigner , представленный в инструментах сборки 24.03 (Android 7), однако, может отказаться от APK. Вы можете просто повторить команду подписи, чтобы подписать новое хранилище ключей / сертификат (старые будут удалены).

apksigner sign --ks keystore.jks signed_app.apk

Бесстыдный плагин: если вам нужен более простой инструмент, который может подписывать несколько apks и лучше выводить данные из журнала: https://github.com/patrickfav/uber-apk-signer (использует фоновый файл apksigner.jar от Google)

3 голосов
/ 11 июня 2013

Все вышеперечисленные решения работают.Просто обратите внимание, почему это не сработало для вас при повторном архивировании:

Некоторые файлы в .apk должны оставаться сохраненными (сжатие при 0%).Это потому, что Android будет использовать отображение памяти (mmap) для чтения содержимого без распаковки в память.Это файлы .ogg и некоторые значки.

2 голосов
/ 13 октября 2016

Если ваши ключи хранятся в keys.keystore, вы можете выполнить:

$ 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

, чтобы определить псевдоним вашего ключа.Затем выполните:

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

для повторной подписи your_app.apk с ключом с именем your_key_alias.

Дополнительная опция -sigfile CERT, по-видимому, необходима с JDK 8.

...