Подписание APK с помощью ключа загрузки, предоставляемого Google Play

Я пытаюсь понять, как загрузить приложение в Google Play, используя подписку на Google Play.

Вот что я сделал:

  • Создано приложение
  • Используется keytool.exe для генерации ключа для этого приложения.
  • Загружено приложение в Google Play
  • Зарегистрировано в подписях приложений Google Play
  • Попробуйте загрузить приложение снова без успеха.

Он жалуется, что сертификат не является сертификатом

Загрузите новый APK в Production

Ошибка загрузки Вы загрузили APK, который не подписан с сертификатом загрузки. Вы должны использовать тот же сертификат. У сертификата загрузки есть отпечаток: [SHA1: 0C:...] и сертификат, используемый для подписи APK, который вы загрузили, имеет отпечаток пальца: [SHA1: 2D:...]

После поиска какое-то время. Я узнаю, как разместить сертифицированную версию, размещенную на консоли Google Play, в моем хранилище ключей. Что-то вроде этого:

keytool.exe -importcert -file upload.pem -keystore myapp-release-key.keystore

Кажется, что сертификат находится. Когда я перечисляю содержимое хранилища ключей, вот что я получаю:

keytool.exe -list -keystore trackcoachfull-release-key.keystore Введите пароль хранилища ключей:

Тип типоразмеров: JKS Поставщик ключей: SUN

Ваше хранилище ключей содержит 2 записи

myappfull, 18 мая 2017, PrivateKeyEntry, Сертификат отпечатка пальца (SHA1): 2D:... uploadkey, 19 мая 2017, trustedCertEntry, Отпечаток сертификата (SHA1): 0C:...

Теперь, когда я заблокирован...

В Android Studio я пытаюсь сгенерировать подписанный APK с помощью uploadkey.

Сборкa > Сгенерировать подписанный APK Выберите хранилище ключей выше Введите пароль хранилища ключей Выберите uploadkey в качестве ключевого псевдонима Я могу ввести пароль ключа.

Ошибка в Android Studio:

Ошибка: выполнение выполнено для задачи ': app: packageFullRelease'.

com.android.ide.common.signing.KeytoolException: Не удалось прочитать ключевую кнопку загрузки из хранилища    "C:\Users\Admin\AndroidStudioProjects\хранилище ключей\myappfull-релиз-key.keystore":   доверенные записи сертификатов не защищены паролем

Мой вопрос:

Как вы создаете APK, подписанный с помощью ключа загрузки, предоставленного Google Play?

Спасибо

Ответ 1

Я смог подписать APK, используя ключ загрузки, предоставленный Google Play. Ниже приведены шаги, которые я выполнил для нового приложения:

  • Создайте хранилище ключей и добавьте ключ подписи с помощью Android Studio
  • Подпишите приложение, используя ключ, созданный в (1)
  • Загрузите APK в Google Play.
  • Загрузить "Загрузить сертификат" из консоли Google Play.
  • Добавить загруженный сертификат в хранилище ключей, созданное на шаге (1), используя команду keytool.exe -importcert -file upload_cert.der -keystore <keystorefile>
  • Следует указать, что "сертификат уже существует в хранилище ключей под псевдонимом. Вы все еще хотите его добавить? [no]:"
  • Введите 'y' и нажмите enter
  • Появится сообщение с подтверждением
  • Для последующих сборок подписывайте приложение, используя тот же процесс, что и в (2)

Важно отметить, что на этапе (6) импорт keytool обновляет исходный сертификат с загруженного из Google Play.

Ответ 2

Краткий ответ:

Вы не можете подписать APK с сертификатом загрузки в консоли Google Play.

Надеюсь, этот ответ не даст другим тратить столько времени, сколько я пытался найти решение, которого не существует.


Длинный ответ:

Статья поддержки Google Play Управление ключами подписи вашего приложения содержит информацию, необходимую для понимания этого.

Из раздела " Типы ключей и важные определения ":

  • Ключ загрузки (необязательно для существующих приложений): новый ключ, который вы генерируете при регистрации в программе. Вы будете использовать ключ загрузки, чтобы подписать все будущие APK файлы перед их загрузкой в Play Console.
  • Закрытый ключ: для подписей APK это ключ, используемый для подписи APK. Закрытый ключ должен храниться в секрете.
  • Открытый ключ: для подписей APK это ключ, используемый для проверки подписи APK. Открытый ключ может быть виден всем.
  • Сертификат: сертификат содержит открытый ключ, а также некоторую дополнительную информацию о том, кто владеет ключом.

Затем обратите внимание, что в консоли Google Play вы можете загрузить только сертификат загрузки (в отличие от ключа загрузки). На основании приведенных выше определений можно сделать вывод, что:

  1. ключ загрузки - это закрытый ключ, поскольку ключ загрузки используется для подписи APK.
  2. сертификат загрузки не содержит закрытого ключа, поскольку сертификаты, как правило, содержат открытые ключи, а не закрытые ключи (есть исключения, в некотором роде, но не в этом случае).
  3. Таким образом, сертификат загрузки не может быть использован для подписания APK, независимо от того, какие шаги вы предпринимаете. Он просто не содержит необходимой информации.

Как еще одно свидетельство, этот другой вопрос SO (ошибка подписи Android: записи доверенных сертификатов не защищены паролем) касается той же проблемы, однако, поскольку он не ссылается на ключи/сертификаты загрузки, легко пропустить последствия этого вопроса - - то, что вы ничего не можете загрузить из Google Play, решит эту проблему.


Претензии наоборот

Хотя некоторые люди сообщают, что подписать ваш APK можно с помощью сертификата загрузки, загруженного из Google Play, я полагаю, что они неправильно понимают, что произошло. Обратите внимание, что, как правило, в этих отчетах указывается, что вы должны импортировать сертификат в исходное хранилище ключей, используемое для генерации ключа. Фактически, когда они думают, что импортируют (закрытый) ключ, необходимый для подписания APK, они фактически просто импортируют открытый ключ и перезаписывают открытую половину пары ключей - с тем же открытым ключом, который был экспортирован в сертификате. на первом месте.

Если бы они попытались подписать APK с этим псевдонимом, БЕЗ процедуры импорта, это сработало бы так же хорошо. (Импорт для них ничего не изменил.) Поэтому кажется, что импорт работает только при использовании с исходным хранилищем ключей, а не с новым хранилищем ключей.


Так что вы можете сделать вместо этого?

Это зависит от вашей ситуации. Поскольку цель состоит в том, чтобы подписать APK и успешно загрузить его в Google:

  1. В какой-то момент во время настройки "подписывания приложения в Google Play" кто-то сгенерировал ключ загрузки и зарегистрировал его в Google. Если у вас еще есть этот (закрытый) ключ в хранилище ключей, это именно то, что вам нужно, чтобы подписать свой APK.
  2. Если вы сгенерировали ключ загрузки с помощью какого-либо инструмента, отличного от keytool а затем импортировали его в хранилище ключей, и у вас все еще есть исходный сгенерированный файл, вы можете снова импортировать закрытый ключ в другое хранилище ключей, используя тот процесс, который использовался в первый раз.
  3. Если ни один из перечисленных вариантов не подходит, вы можете следовать инструкциям в разделе "Создание нового ключа загрузки" статьи " Управление ключами подписи приложения", чтобы сгенерировать новый ключ загрузки и попросить Google заменить его.

Ответ 3

Я думаю, что вы, должно быть, создали свое хранилище ключей, как это, из папки "java\bin":

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

Если вы хотите обновить приложение yout, вам придется использовать одно и то же хранилище ключей, которое вы создали.

  • Перейдите к сборке > Сгенерировать подписанный APK.

  • Выберите "Выбрать существующий" и перейдите к пути к хранилищу ключей

  • Введите "пароль хранилища ключей"

  • В ключевом псевдониме нажмите "..." и проверьте, совпадает ли ваш псевдоним ключа с тем, который вы предоставили, при создании хранилища ключей

  • Если да, снова укажите "Пароль ключа"

  • Нажмите "Далее"

Сообщите мне, на каком этапе вы получаете проблему, поэтому я могу направить вас соответствующим образом.

Ответ 4

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

Keytool -list - хранилище ключей WeatherForecast.jks (ваше хранилище ключей)

Нажмите ввод, когда он запрашивает пароль.

Вы увидите две записи, и первое слово будет псевдонимом для вашего хранилища ключей.

Это сработало для меня, и я думаю, что это сработает для вас.

Ответ 5

Мне пришлось связаться с Google и следуя приведенным ниже инструкциям, чтобы сгенерировать новый ключ и загрузить сертификат.

Новый ключ загрузки будет использоваться для подписи APK, которые вы загружаете в Play.

Вот как сгенерировать и зарегистрировать новый ключ загрузки:

  1. Следуйте инструкциям в справочном центре Android Studio для создания нового ключа. Он должен отличаться от любых предыдущих ключей. В качестве альтернативы вы можете использовать следующую командную строку для генерации нового ключа: keytool -genkeypair -alias загрузить -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks

Этот ключ должен быть 2048-битным ключом RSA и иметь срок действия 25 лет.

2. Экспортируйте сертификат для этого ключа в формат PEM: keytool -export -rfc -alias загрузить -file upload_certificate.pem -keystore keystore.jks

3. Ответьте на это письмо и прикрепите файл upload_certificate.pem.