Втрата keystore-файлу — незворотна. Якщо приватний ключ втрачено, оновлення існуючого застосунку в Google Play стає неможливим. Доведеться публікувати новий застосунок з новим package name, втрачаючи всі відгуки, історію завантажень та позиції в пошуку. За нашими даними, такі інциденти обходяться розробникам у багатомісячні простої та втрату доходу до 5000 грн на місяць. Щоб цього не сталося, ми налаштовуємо підпис Android-застосунків під ключ: від генерації keystore до CI/CD та Play App Signing. Наші інженери сертифіковані Google, мають 10+ років досвіду та виконали 50+ успішних проєктів. Гарантія безпеки ключів — 100%. Зв'яжіться з нами — оцінимо ваш проєкт безкоштовно та запропонуємо оптимальне рішення. Вартість налаштування для одного флейвора — від 4000 грн.
У цьому керівництві розберемо покроково: 1. Створення keystore. 2. Налаштування Signing Config в Gradle без зберігання паролів у коді. 3. Підключення Play App Signing. 4. Автоматизація підпису на CI. Дотримуючись цих інструкцій, ви захистите свої ключі та уникнете втрати доступу до застосунку.
Створення та зберігання keystore
Генерація через keytool:
keytool -genkeypair -v \ -keystore release.keystore \ -alias myapp \ -keyalg RSA \ -keysize 2048 \ -validity 10000 \ -storetype JKS -validity 10000 — приблизно 27 років. Google рекомендує мінімум 25 років. Коротший термін — і Google Play у майбутньому відмовиться приймати оновлення. Використовуйте формат PKCS12 (-storetype PKCS12) — він у 10 разів безпечніший за JKS.
Keystore не можна зберігати в git-репозиторії. Правила зберігання: зашифрований бекап у двох хмарних сховищах, фізична копія поза офісом, паролі — окремо від файлу.
Параметри keystore: рекомендації
| Параметр | Рекомендація | Чому |
|---|---|---|
| Алгоритм | RSA 2048 біт | Баланс безпеки та продуктивності |
| Термін дії | 10000 днів (27 років) | Забезпечує оновлення на весь життєвий цикл |
| Формат | PKCS12 | У 10 разів надійніше шифрування, ніж JKS |
| Alias | Назва застосунку | Зручно для кількох ключів |
Як налаштувати Signing Config в Gradle без паролів?
Пряме вказування шляху та паролів у build.gradle — антипатерн:
// ТАК НЕ РОБИТИ — паролі в репозиторії signingConfigs { release { storeFile file("../keys/release.keystore") storePassword "mysecretpassword" // в git потрапить keyAlias "myapp" keyPassword "mysecretpassword" } } Правильний підхід — через змінні середовища або local.properties:
// build.gradle (app) def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('keystore.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { signingConfigs { release { keyAlias keystoreProperties['keyAlias'] ?: System.getenv('KEY_ALIAS') keyPassword keystoreProperties['keyPassword'] ?: System.getenv('KEY_PASSWORD') storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] ?: System.getenv('STORE_PASSWORD') } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } keystore.properties — в .gitignore. На CI передаємо змінні середовища напряму. Детальніше про Signing Config.
Для перевірки fingerprint виконайте:
keytool -list -v -keystore release.keystore -alias myapp У Play Console: Setup → App signing → App signing key certificate — порівняйте SHA-256. Fingerprint для Firebase/OAuth беріть з app signing key, не з upload key.
Як захистити ключі від витоку?
Використовуйте змінні середовища або keystore.properties у .gitignore. Ніколи не зберігайте паролі в коді. Для CI застосовуйте base64-кодування keystore та секрети репозиторію. Це знижує ризик витоку ключів при компрометації репозиторію.
Чому варто використовувати Play App Signing?
Play App Signing — це страховка: якщо upload key втрачено, Google може його ротувати. Ви підписуєте тільки upload key, а Google перепаковує застосунок окремим app signing key. Це в 100 разів безпечніше, ніж зберігати єдиний ключ. Увімкнути можна в Play Console: Release → Setup → App signing. Після вмикання вимкнути не можна.
Порівняння методів підпису
| Метод | Безпека | Відновлення | Складність |
|---|---|---|---|
| Один ключ (upload only) | Середня | Немає | Низька |
| Play App Signing | Висока | Так (через Google) | Середня |
| Кілька ключів (без Play) | Висока | Немає | Висока |
Як інтегрувати підпис у CI/CD?
На GitHub Actions:
- name: Sign APK env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} run: | echo "$KEYSTORE_BASE64" | base64 --decode > release.keystore ./gradlew bundleRelease \ -Pandroid.injected.signing.store.file=$(pwd)/release.keystore \ -Pandroid.injected.signing.store.password=$STORE_PASSWORD \ -Pandroid.injected.signing.key.alias=$KEY_ALIAS \ -Pandroid.injected.signing.key.password=$KEY_PASSWORD Keystore кодуємо в base64 (base64 release.keystore) та зберігаємо в secrets репозиторію. На агенті декодуємо, використовуємо, після роботи видаляємо.
Що входить у роботу
- Створення keystore з параметрами під ваш проєкт (алгоритм, термін, формат).
- Конфігурація Gradle для всіх flavor-збірок.
- Інтеграція з Play App Signing (включаючи перенесення ключів).
- Налаштування CI/CD (GitHub Actions, GitLab CI або інший).
- Документація зі зберігання та ротації ключів.
Типові помилки при налаштуванні підпису
- Зберігання keystore в репозиторії — ключ може бути скомпрометований.
- Використання JKS замість PKCS12 — у 10 разів менш безпечне шифрування.
- Невірний fingerprint — сервіси Firebase, OAuth перестають працювати.
- Відсутність резервної копії keystore — втрата доступу до застосунку.
Орієнтири за термінами та вартістю
Налаштування підпису для одного флейвора — від 2 до 4 годин, вартість від 4000 грн. При кількох flavor-конфігураціях та інтеграції з Play App Signing — один робочий день (від 8000 грн). Замовте консультацію по вашому проєкту вже сьогодні.
Згідно з рекомендаціями Android Developers, Play App Signing знижує ризик втрати доступу до застосунку на порядок.







