Как подписать APK с несколькими сертификатами?

Как подписать APK с несколькими сертификатами, чтобы я мог это сделать, когда публиковал в Android Market:

Версия 1.0 = > Подписано с сертификатом A
Версия 2.0 = > Подписано сертификатом A и B
Версия 3.0 = > Подписан с сертификатом B

Android Market действительно дает мне некоторую надежду, но я не уверен, что с этим делать, когда я загружаю другой сертификат знака, он дает мне это сообщение:

"Apk должен быть подписан с хотя бы одним сертификатом, общим с предыдущей версией".

Мотив:
Я опубликовал приложение на рынке с помощью Android Signing Tool как часть MotoDev Studio для Android. Проблема в том, что он обрабатывает сами ключи, и нет способа (документально) получить их. Я хочу изменить его, чтобы использовать хранилище ключей и сертификат, который я больше контролирую и могу использовать, даже если я больше не использую MotoDev Studio. Также кажется, что MotoDev Studio заблокирует вас от новых функций, таких как общие библиотеки.

ОБНОВЛЕНИЕ 5/3/2011:
Они действительно очень быстро и оперативно обновили MotoDev Studio, но похоже, что я считаю, что Google должен по-прежнему обеспечивать работу для тех, кто хотите изменить сертификаты своих приложений. Обновление приложения для всех использует один и тот же сертификат, создавая новые с течением времени и, возможно, создавая новый, чтобы вы могли передать поддержку и распространение своего приложения другим пользователям.

Ответы

Ответ 1

Если вы хотите подписывать APK более одного раза, просто сделайте это.
Но обратите внимание, что Google Play не принимает APK с несколькими сигнатурами.

например. Вы можете подписать APK из командной строки, используя jarsigner, например:
jarsigner -keystore original-keystore my-app-unsigned.apk key-alias псевдоним

Затем просто повторите это со вторым ключом:
jarsigner -keystore new-signing-keystore my-app-unsigned.apk key-alias

Не забудьте запустить zipalign после:
zipalign -v 4 my-app-unsigned.apk my-app.apk


Я просто перечитываю часть о студии MotoDev. В этом случае вы можете просто подписать APK сначала с помощью MotoDev, как обычно, а затем подписать новый ключ в командной строке, как указано выше.

Ответ 2

Мне было очень приятно видеть этот пост, пока я не увидел комментарий @ddrruver (2010-06-05) и комментарий @cistearns (2011-03-01).

Тем не менее, на самом деле существует серьезная проблема безопасности с описанным вами способом перехода (если это будет работать так, как вы ожидаете), что делает довольно простым для злоумышленника замену вашего приложения, если оно может заставить ваших пользователей установить свои материал:

  • Вы отпустите свое приложение, подписанное сертификатом A.
  • Злоумышленник получает apk, дополнительно подписывает его с сертификатом M и распространяет приложение.
  • Затем злоумышленник может освободить вредоносное приложение, подписанное с сертификатом M, чтобы заменить ваши и получить доступ к любым данным, которые он может хранить.

Обычно, если злоумышленник пытался что-то заменить, установка откажется, если оригинал не будет удален - в этот момент данные будут стерты.

С другой стороны, существует еще несколько допустимых вариантов использования для перехода ключа/сертификата: обновление ключа, передача другому разработчику и т.д.

Это можно сделать более надежно, разрешив переход на новый ключ из старого ключа. См. вопрос в проекте Android.

Ответ 3

У меня была проблема сегодня, и вот что я сделал:

  • Резервное копирование старого файла motodev.keystore
  • Используйте последнюю студию motodev (2.0.1), чтобы изменить мой пароль motodev.keystore(измените его в представлении motodev, где вы можете импортировать хранилище ключей)
  • Преобразуйте файл хранилища motodev (типа JCEKS) в обычный файл хранилища ключей (тип JKS) с помощью программы keytool.exe в комплекте с java:

keytool -importkeystore -srckeystore motodev.keystore -srckeystoretype JCEKS -destkeystore android.keystore -destkeystoretype JKS

Теперь файл android.keystore можно использовать в плагинах Google Eclipse для экспорта вашего приложения в подписанный APK