Поскольку ключ подписи используется для проверки того, что именно вы являетесь разработчиком приложения, и для обеспечения безопасных обновлений для ваших пользователей, обеспечение безопасности ключа очень важно как для вас, так и для пользователей. Существуют различные способы подписания своих приложений, один из таких мы рассмотрели в предыдущей статье.
Недавно Google добавил новую возможность хранить ключи: в своей собственной инфраструктуре благодаря Google Play App Signing. Основное отличие здесь заключается в том, что вы подписываете приложение специальным ключом загрузки, который Google проверяет и удаляет, заменяя его оригинальным ключом подписи приложения, который вы предоставили.
С его помощью можно управлять ключами подписи приложений как для новых, так и для опубликованных приложений, которые в свою очередь будут храниться у Google в их собственном хранилище ключей. Чтобы присоединиться к этой программе, необходимо подписаться на неё в своей Google Play Console. Стоит отметить, что в последствии отписаться от неё уже будет невозможно.
Таким образом, при подключении к Google Play App Signing происходит следующее:
- Бессрочная регистрация вашего приложения в программе Google Play App Signing.
- Передача вашего ключа подписи приложения в Google.
- Регистрация нового ключа загрузки для всех последующих APK-файлов.
Такой способ очень полезен, поскольку в случае, если вы потеряли хранилище ключей, Google Play App Signing позволит сбросить ключ для установки нового. Согласитесь, это намного проще, чем каждый раз публиковать приложение заново с новым именем пакета и ключом.
Попробуем, используя этот способ, опубликовать новое приложение : Менеджер системных приложений.
Для начала необходимо создать ключ загрузки, по которому Google будет проверять APK. Для этого средствами Android Studio через меню Build – Generate Signed APK создадим новое хранилище ключей, в котором будет содержаться наш ключ загрузки. Создание подписи приложения будет происходить с помощью Gradle, а файл, содержащий путь до хранилища и пароли, вынесем из проекта и будем хранить отдельно.
signingConfigs { release { if (project.hasProperty("Keys.repo")) { def projectPropsFile = file(project.property("Keys.repo") + "/system-app-manager.properties") if (projectPropsFile.exists()) { Properties props = new Properties() props.load(new FileInputStream(projectPropsFile)) storeFile file(file(project.property("Keys.repo") + props['RELEASE_STORE_FILE'])) storePassword props['RELEASE_STORE_PASS'] keyAlias props['RELEASE_ALIAS'] keyPassword props['RELEASE_KEY_PASS'] } } else { println "=======================================================" println "[ERROR] - Please configure release-compilation environment - e.g. in ~/.signing directory" println "=======================================================" } } }
О том, как это можно сделать для своего приложения, можно почитать в данной статье.
Теперь перейдём в консоль разработчика. Создадим новое приложение и дадим ему название. После этого нужно перейти в “Версии приложения” – “Управление рабочей версией” – “Создать выпуск“. Здесь вам будет предложено подключиться к програме Google Play App Signing, нажимаем “Продолжить“.
Если перейти в “Подписи приложения“, то можно обнаружить, что был создан сертификат для подписи, однако сертификат загрузки остался пустым. Это потому, что мы ещё не загрузили первый подписанный APK файл.
Вернёмся в создание выпуска. После получения подтверждения о том, что мы подключились к программе, можно перейти к загрузке APK.
Здесь нужно загрузить APK файл своего приложения, подписанный ключом, который был создан выше. Этот ключ и станет ключом загрузки для приложения, которым вы должны будете подписывать все APK в будущем.
После того, как вы загрузите APK, подписанный ключом загрузки, его сертификат появится в “Подписи приложения“.
После заполнения всех необходимых полей в консоли и публикации приложения в Google Play, в приложении уже будет использоваться другой ключ подписи, который будет находиться у Google и отправляться пользователям при загрузке приложения из маркета.
Узнать, что приложение подписано Google, а не самим разработчиком, можно по следующему элементу метаданных, содержащемуся в тэге <application> в файле манифеста:
<meta-data android:name="com.android.vending.derived.apk.id" android:value="[ID]" />
Как сбросить ключ загрузки?
В случае, если вы потеряли свой ключ загрузки или он был похищен кем-либо, вы можете сбросить его в консоли разработчика. Чтобы сделать это, нужно:
- Создать новый ключ загрузки аналогично тому, как это делалось в начале статьи. Затем его нужно будет экспортировать в сертификат PEM с помощью следующей команды.
keytool -export -rfc -alias upload -file <upload_certificate.pem> -keystore <keystore.jks>
- После создания сертификата нужно обратиться в службу поддержки по следующей ссылке, заполнив все поля и прикрепив файл сертификата. Как только запрос будет обработан, вам на электронную почту придут инструкции по смене ключа.
Скачаем опубликованное приложение и посмотрим, что у него внутри. Для этого воспользуемся любым декомпилятором APK файлов.
Если открыть манифест приложения, то внутри можно обнаружить ту самую строку с метаданными, о которой мы говорили выше.
Данный идентификатор будет использоваться в инструментах отчётности об ошибках и по нему можно определить нужный APK-файл.
К сожалению, оптимизации APK не происходит, как было заявлено разработчиками. Google Play должен предоставлять оптимизированный APK с нужными локалями и плотностью экрана. Однако если посмотреть, что находится в ресурсах декомпилированного APK, то можно обнаружить там все локализации, которые были созданы для приложения, и разметки экранов с плотностью.
Кроме декомпилятора это также можно проверить утилитой aapt.exe (Android Asset Packaging Tool), которая входит в состав Android SDK. Для этого нужно ввести следующую команду:
aapt dump badging apk_name.apk
Как подписаться, если приложение уже опубликовано?
В случае, если вы хотите подписать своё опубликованное приложение на Google Play App Signing, то вам нужно будет в консоли разработчика открыть проект приложения и затем выбрать “Управление релизом” – “Версии приложения“.
В открывшемся окне помимо различный вариантов сборок и версий вашего приложения должно появиться приглашение подключиться к Google Play App Signing.
Вам перекинет на страницу “Подписи приложений” с описанием программы. Вам нужно будет оттуда скачать утилиту PEPK и с помощью неё выполнить следующую команду, заменив выделенные участки на свои:
java -jar pepk.jar --keystore=ваше_хранилище_ключей.keystore --alias=имя_ключа --output=новый_путь_для_созданного_сертификата --encryptionkey=eb10fe8f7c7c9df715022017b00c6471f8ba8170b13049a11e6c09ffe3056a104a3bbe4ac5a955f4ba4fe93fc8cef27558a3eb9d2a529a2092761fb833b656cd48b9de6a
Эта утилита позволяет вам извлечь определённый ключ из хранилища ключей и экспортировать его в PEM сертификат. Для примера попробуем экспортировать ключ для другого приложения. После ввода команды нас попросят ввести пароли от хранилища и от ключа, и если всё завершится без ошибок, значит операция выполнена успешно.
Если PEPK выдаёт ошибку на неправильный alias, хотя вы полностью уверены, что он верен – попробуйте написать его только маленькими буквами, если в нём имеются заглавные.
Затем на той же странице в консоли разработчика нужно нажать на “Закрытый ключ для подписи приложения” и выбрать наш созданный сертификат. Таким образом Google поймёт, что именно мы являемся разработчиком приложения. После этого можно приступать к созданию ключа загрузки, по которому в будущем будет происходить публикация всех APK-файлов.
Для этого нужно создать ключ тем же способом, каким мы создавали его в начале статьи. Затем с помощью стандартной утилиты Java под названием Keytool нужно будет экспортировать ключ в PEM сертификат с помощью следующей команды:
keytool -export -rfc -keystore ваше_хранилище_ключей -alias имя_ключа -file путь_для_сертификата
На странице консоли разработчика нажимаем “Сертификат открытого ключа загрузки” и выбираем созданный сертификат с ключом загрузки.
После проделанных операций у нас станет активна кнопка “Зарегистрировать”, нажимаем её и, если нет никаких ошибок, Google Play App Signing будет подключён к вашему приложению и вы увидите отпечатки сертификата.
Теперь вы можете загружать новые APK, подписывая их своим ключом загрузки, после чего Google будет заменять его на ключ из собственного хранилища.
Новая технология от Google немного облегчила жизнь разработчикам, будем жать, когда она действительно облегчит выходной APK-файл.
Почему-то обошли вниманием самое важное: как указать свой первый ключ загрузки. В документации написано что после нажатия на кнопку “продолжить” запускается некий Enrollment Process в котором можно скачать Play Encrypt Private Key tool, экспортировать ключ и загрузить этот ключ на сервер.
У меня оно просто сказало “Молодец, теперь будет использоваться GPAS” и не дает загружать никакие APK.
Ну и стоит написать что вернуться на обычный способ подписи можно только через удаление приложения и создание его заново.
Ситуация аналогична с Константином, читал пост с надеждой найти ответ.