Введение / Зачем это нужно
Keystore — это цифровая подпись, которая подтверждает авторство вашего приложения и гарантирует целостность кода. Магазины приложений, включая Google Play, требуют, чтобы каждая релизная сборка была подписана одним и тем же ключом. Если вы попытаетесь загрузить обновление с другим сертификатом, публикация будет отклонена, а пользователям придётся устанавливать приложение заново.
После выполнения этого гайда у вас появится готовый .jks файл, правильно настроенный для подписи, а также понимание, как безопасно его хранить и интегрировать в процесс сборки.
Требования / Подготовка
Перед началом убедитесь, что соблюдены базовые условия:
- Установлен JDK 8 или новее (утилита
keytoolвходит в его состав) - Доступ к терминалу (командная строка, PowerShell или Bash)
- Менеджер паролей для надёжного хранения учётных данных
- Выбранная директория с ограниченным доступом (желательно не в корневой папке проекта)
Шаг 1: Откройте терминал и подготовьте директорию
Запустите терминал и создайте отдельную папку для ключей. Хранить их рядом с исходным кодом или в открытых репозиториях запрещено.
mkdir -p ~/android_keys
cd ~/android_keys
💡 Совет: Если вы работаете в Windows, используйте
mkdir android_keysиcd android_keys. Путь можно разместить на отдельном логическом диске или в зашифрованном контейнере.
Шаг 2: Сгенерируйте ключ через keytool
Выполните команду создания пары ключей. Параметры ниже соответствуют современным стандартам безопасности Google Play.
keytool -genkeypair -v \
-keystore my_app_release.jks \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
-alias release_alias
Что делает команда:
-genkeypair: создаёт пару закрытый/открытый ключ-keystore: задаёт имя файла хранилища-keyalgи-keysize: используют алгоритм RSA длиной 2048 бит (оптимальный баланс безопасности и производительности)-validity 10000: устанавливает срок действия ~27 лет-alias: уникальное имя ключа внутри файла (запомните его)
Шаг 3: Заполните метаданные и установите пароли
После запуска терминал запросит данные в интерактивном режиме. Отвечайте последовательно:
- Введите пароль для хранилища и подтвердите его.
- Укажите имя и фамилию, название подразделения, организации, города и страны (можно оставить поля пустыми, нажав
Enter, но для корпоративных проектов лучше заполнить). - Подтвердите сгенерированную строку
DN(Distinguished Name). - Введите пароль для
release_alias. Разрешено использовать тот же пароль, что и для хранилища, если нажмётеEnter.
⚠️ Важно: Пароли нельзя восстановить. Запишите их сразу в менеджер паролей. Символы с клавиатуры не отображаются при вводе — это нормально.
Шаг 4: Создайте резервную копию файла
После успешной генерации в директории появится my_app_release.jks. Сделайте минимум две копии:
- Зашифрованный архив на внешний носитель
- Резервная копия в облаке с двухфакторной аутентификацией
Проверьте целостность файла:
ls -la my_app_release.jks
Шаг 5: Подключите хранилище к проекту
- Откройте Android Studio.
- Выберите
Build → Generate Signed Bundle / APK. - В поле
Key store pathукажите путь кmy_app_release.jks. - Введите
Key store password,Key aliasиKey password. - Нажмите
Next, выберитеreleaseконфигурацию и завершите сборку.
Для автоматизации добавьте данные в build.gradle (модуль приложения), используя переменные окружения или keystore.properties, чтобы ключи не попали в систему контроля версий.
Проверка результата
Убедитесь, что файл подписи корректен и содержит нужные данные:
keytool -list -v -keystore my_app_release.jks
В выводе найдите строку Entry type: PrivateKeyEntry. Проверьте срок действия (Valid from / Valid until) и совпадение Alias name с тем, что вы указали при создании. Если команда выводит список без ошибок, файл готов к использованию в CI/CD-пайплайнах или ручных сборках.
Возможные проблемы
keytool: command not foundили'keytool' is not recognized— утилита не добавлена в системныйPATH. Укажите полный путь к исполняемому файлу JDK (например,C:\Program Files\Java\jdk-17\bin\keytool.exe) или обновите переменные окружения.java.security.InvalidKeyException: Illegal key size or default parameters— версия JDK устарела или отсутствуют JCE Unlimited Strength. Обновите JDK до 8u161+ или 11+.java.io.IOException: Keystore was tampered with, or password was incorrect— проверьте раскладку клавиатуры, отключите автозамену символов и убедитесь, что не включён Caps Lock. При вводе через терминал используйте копирование из менеджера паролей.Validity too short— Google Play отклоняет ключи со сроком менее 25 лет. Пересоздайте хранилище с флагом-validity 10000или выше.