Code Signing (kód aláírása) — a futtatható állományok digitális aláírásának mechanizmusa, amely garantálja a fejlesztő hitelességét és az alkalmazás integritását. Az Androidban minden APK-fájlt alá kell írni tanúsítvánnyal az eszközre történő telepítés vagy a Google Play-ben történő közzététel előtt. A Google, 2024 adatai szerint az Android négy generációs aláírási sémát támogat: a JAR-alapú v1-től a streaming telepítéshez tervezett v4-ig.
Főbb pontok
Code Signing — kriptográfiai folyamat, melynek során a fejlesztő a futtatható kódot a saját digitális tanúsítványával írja alá. Az aláírás aszimmetrikus titkosítással történik: a fejlesztő magánkulcsával digitális aláírás jön létre, a nyilvános kulcs pedig a tanúsítványba van ágyazva. Bárki ellenőrizheti az aláírást a nyilvános kulcs segítségével, de a kód módosítása az aláírás megsértése nélkül lehetetlen.
A mobilfejlesztésben a kód aláírása három funkciót tölt be. Első — hitelesítés: a felhasználó és a platform azonosíthatja az alkalmazás fejlesztőjét. Második — integritás: az APK bármilyen módosítása az aláírás után érvényteleníti az aláírást. Harmadik — megbízható frissítés: a platform csak azokkal az APK-kkal engedi frissíteni az alkalmazást, amelyeket ugyanaz a tanúsítvány írt alá, mint a telepített verziót.
Az Android-alkalmazások digitális aláírása jogi jelentőséggel bír. Az Orosz Föderáció jogszabályainak (63-FZ) és az európai eIDAS-nak megfelelően a minősített elektronikus aláírás egyenértékű a kézzel írt aláírással. Az APK önaláírásos tanúsítvánnyal történő aláírása (az Androidban általános gyakorlat) azonban nem minősített — megerősíti az integritást, de nem igazolja a fejlesztő személyazonosságát jogi szempontból.
Android négy APK-aláírási sémát támogat, amelyek mindegyike megoldja az előző verzió problémáit és új lehetőségeket ad. Az összes séma együtt létezhet egy APK-ban — ez a régebbi Android-verziókkal való visszafelé kompatibilitás fenntartásához szükséges.
A v1 (JAR aláírás) séma az Android 1.0-ban jelent meg. Az APK archívumon belül egyes fájlokat a META-INF/MANIFEST.MF bejegyzésein keresztül ír alá. Hátránya: az APK módosítható (fájlok hozzáadhatók vagy eltávolíthatók), és csak a módosított fájlok írhatók alá újra, a többiek aláírásának érintése nélkül. Ez teszi a v1-et sebezhetővé bizonyos támadásokkal szemben. Az Android 7.0-ban bevezetett v2 (APK Signature Scheme) séma a teljes APK-fájlt írja alá teljes egészében, beleértve az összes bájtot, kivéve magát az aláírást, ami kiküszöböli a szelektív módosítás lehetőségét.
| Séma | Android | Jellemző | Kulcsrotáció |
|---|---|---|---|
| v1 (JAR) | 1.0+ | Minden fájl aláírása | Nem |
| v2 | 7.0+ | Teljes APK aláírása | Nem |
| v3 | 9.0+ | Aláírás + rotáció | Igen |
| v4 | 11.0+ | Streaming + ADB | Igen |
Az Android 9.0-ban bemutatott v3 séma egy régi problémát old meg: mi történjen, ha az aláírási kulcs kompromittálódott vagy lejárt? Korábban az aláírási kulcs megváltoztatása azt jelentette, hogy az alkalmazás újnak számít — nem telepíthető a meglévőre. A v3 hozzáad egy rotációs mechanizmust: az APK-ba belefoglalható a kulcsváltás bizonyítéka (proof-of-rotation), amelyet a régi kulcs írt alá. A rendszer ellenőrzi a láncot, és lehetővé teszi az új kulccsal aláírt alkalmazás frissítését.
Keystore — védett tároló, amely magánkulcsokat és tanúsítványokat tartalmaz az alkalmazások aláírásához. Az Android-fejlesztésben JKS (Java KeyStore) vagy PKCS12 formátumot használnak. A keystore a JDK részét képező keytool segédprogrammal jön létre. A tárban minden kulcsot egy alias azonosít és jelszó véd.
A keystore-ban lévő tanúsítvány tartalmazza a nyilvános kulcsot és a tulajdonosra vonatkozó információkat: szervezet nevét, országot, érvényességi időtartamot. Android-alkalmazások esetén a tanúsítvány önaláírásos lehet — a Google nem követeli meg tanúsítványkiadóhoz (CA) fordulást, ami megkülönbözteti az Androidot az iOS-től. A tanúsítvány érvényességi idejének azonban legalább 25 évnek kell lennie, mert az alkalmazást ugyanazzal a kulccsal frissítik.
# Új keystore létrehozása aláíráshoz
keytool -genkey -v -keystore my-release.keystore \
-alias my-app-alias \
-keyalg RSA \
-keysize 2048 \
-validity 10000
# Keystore tartalmának megtekintése
keytool -list -v -keystore my-release.keystore
Az Android két algoritmust támogat az aláírási kulcsokhoz: RSA és ECDSA. RSA 2048 bites kulcsmérettel — tényleges szabvány, amelyet az Android összes verziója támogat. A P-256 görbéjű ECDSA (Elliptic Curve Digital Signature Algorithm) azonos kriptográfiai erősséget nyújt kisebb kulcsméret mellett. Android 9.0-tól kezdve az ECDSA használata ajánlott, mivel gyorsabb az ellenőrzésben mobil eszközökön.
Az Android Gradle Plugin-ben az aláírás a signingConfigs blokkon keresztül konfigurálható a modul szintű build.gradle-ben. Debug fordításokhoz az Android Studio automatikusan létrehoz egy debug keystore-t ismert jelszavakkal. Release fordításokhoz a fejlesztő megadja a saját keystore elérési útját, a kulcs aliasát és a jelszavakat. Javasolt a jelszavakat külön konfigurációs fájlokban tárolni, amelyek ki vannak zárva a verziókezelő rendszerből.
A modern gyakorlat a központosított aláíráskezelés CI/CD-n keresztül. A Jenkins, GitLab CI vagy GitHub Actions tárolhatja a keystore-t védett artefaktként, a jelszavakat pedig környezeti titkokként. Ez megakadályozza a kulcsok szivárgását a repozitóriumon keresztül és leegyszerűsíti a kulcs cseréjét, ha szükséges.
// build.gradle (modul szint) — aláírás konfigurációja
android {
signingConfigs {
release {
storeFile file("my-release.keystore")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
A maximális kompatibilitás érdekében az APK-t mindhárom sémával (v1 + v2 + v3) kell aláírni. Az Android Gradle Plugin alapértelmezés szerint az összes sémát tartalmazza. A csak v2-vel aláírt APK nem telepíthető Android 6.0 és régebbi verziókra. A csak v1-gyel rendelkező APK nem élvezi a v2 integritási előnyeit Android 7.0+-on. Az összes séma belefoglalása nem növeli az APK méretét több mint 1–2%-kal, és kompatibilitást biztosít bármely eszközzel.
Play App Signing — Google Play szolgáltatás, amely központosítottan kezeli az alkalmazások aláírási kulcsait. A fejlesztő feltölti a Google Play Console-ba az upload key-jel aláírt APK-t, és a Google Play újraírja a distribution key-jel, mielőtt elküldené a felhasználóknak. Ez megvédi a distribution key-t az elvesztéstől vagy kompromittálódástól.
A Play App Signing előnyei: biztonság — a distribution key a Google védett tárában van; rotáció — a konzolon keresztül kérhető a kulcs cseréje; helyreállítás — az upload key elvesztése esetén új generálható. Hátránya: a Play App Signing bevezetése előtt létező alkalmazások esetén az áttérés új alkalmazás létrehozását igényli, mert a régi distribution key már használatban van.
# Tanúsítvány ujjlenyomatának lekérése (SHA-256)
keytool -list -v -keystore my-release.keystore \
-alias my-app-alias | grep "SHA256"
# APK aláírásának ellenőrzése apksigner segítségével
apksigner verify --verbose app-release.apk
Ha az aláírási kulcs elveszett és a Play App Signing nem használatos, az alkalmazás frissítési lehetőségének helyreállítása lehetetlen — új alkalmazást kell létrehozni a Google Play-ben új csomagnévvel. Ez az egyik fő oka a Play App Signing használatának. A Google a keystore biztonsági másolatának védett offline tárban (titkosított USB-meghajtó, banki széf) történő tárolását javasolja.
Az APK telepítésekor az Android több lépésben végzi el az aláírás ellenőrzését. Első — a tanúsítvány ellenőrzése: nem járt-e le, helyes-e a formátum. Második — az aláírás ellenőrzése: a kriptográfiai aláírás megegyezik-e az APK tartalmával. Harmadik — a tanúsítvány összehasonlítása a telepített verzióval: ha az alkalmazás már létezik az eszközön, a tanúsítványnak meg kell egyeznie, egyébként a telepítés blokkolva lesz.
Az ellenőrző rendszer a PackageManagerService-be van építve. A telepítési kérelem feldolgozásakor a PMS kivonja az aláírást az APK-ból, ellenőrzi az android.util.PackageParser osztállyal, és összehasonlítja a telepített alkalmazás eltárolt aláírásával (ha létezik). Eltérés esetén a felhasználó a „INSTALL_FAILED_UPDATE_INCOMPATIBLE” hibát kapja. Ez a mechanizmus megakadályozza a helyettesítéses támadásokat (a rosszindulatú szoftver nem frissítheti a legitim alkalmazást a saját verziójával).
A fejlesztő önállóan ellenőrizheti az APK aláírását az Android SDK Build Tools-ból származó apksigner segédprogrammal. Az apksigner verify --verbose app.apk parancs megmutatja, hogy az APK-t milyen sémákkal írták alá, érvényesek-e a tanúsítványok és egyeznek-e az aláírások a tartalommal. A telepített alkalmazás aláírásának programozott ellenőrzéséhez a PackageManager.getPackageInfo() metódust használják a GET_SIGNATURES jelzővel.
// Telepített alkalmazás aláírásának programozott ellenőrzése
fun getAppSignature(context: Context, packageName: String): String? {
val pm = context.packageManager
val info = pm.getPackageInfo(
packageName,
PackageManager.GET_SIGNATURES
)
return info.signatures?.firstOrNull()?.toCharsString()
}
Az aláírási kulcs biztonsága — az Android-fejlesztés kritikus szempontja. A kulcs kompromittálódása lehetővé teszi a támadó számára, hogy a saját kódjával írja alá az alkalmazásának frissítéseit. Alapvető szabályok: soha ne tárolja a kulcsot a repozitóriumban, ne használja ugyanazt a kulcsot különböző alkalmazásokhoz, ne küldje a kulcsot nem biztonságos csatornákon (e-mail, üzenetküldők).
Ajánlott gyakorlat a kulcsok szétválasztása. Használjon külön kulcsot minden alkalmazáshoz és külön kulcsot a Google Play-be történő feltöltéshez (upload key). A debug fordításokhoz az Android Studio egy megosztott debug.keystore-t hoz létre — ezt nem szabad release fordításokhoz használni. A tanúsítvány érvényességi idejének 25–30 évnek kell lennie (jelenlegi szabvány, amelyet a Google is megerősített).
| Gyakorlat | Ajánlás |
|---|---|
| Kulcs tárolása | Titkosított adathordozó, CI/CD titkok |
| Tanúsítvány időtartama | Legalább 25 év |
| Algoritmus | RSA 2048+ vagy ECDSA P-256 |
| Szétválasztás | Külön kulcs alkalmazásonként |
| Biztonsági mentés | Keystore offline másolata |
Rendszeresen ellenőrizze az aláírási lánc integritását. A kulcsokhoz hozzáférő munkavállalók változásakor frissítse az upload key-t a Google Play Console-on keresztül. Használjon olyan eszközöket, mint a Google Play Integrity API annak ellenőrzésére, hogy az alkalmazását nem hamisították meg a felhasználók eszközein. Az API visszaadja az aláírással és integritással kapcsolatos adatokat, és elküldi azokat a szerverre ellenőrzésre.
Gyakran ismételt kérdések
Code Signing — az APK-fájl digitális aláírása, amely megerősíti, hogy az alkalmazást egy adott fejlesztő készítette és az aláírás után nem módosult. Aláírás nélkül az APK nem telepíthető az eszközre.
Használja a JDK-ból származó keytool segédprogramot: keytool -genkey -v -keystore my-release.keystore -alias my-alias -keyalg RSA -keysize 2048 -validity 10000. A kapott keystore-t adja meg a build.gradle fájlban a signingConfigs blokkban.
Ha a kulcs elveszett és nem használja a Play App Signing szolgáltatást, az alkalmazás frissítése lehetetlenné válik. Új alkalmazást kell létrehoznia a Google Play-ben új csomagnévvel. Használja a Play App Signing szolgáltatást a kulcs elvesztése elleni védelemhez.
v1 az APK-n belül minden fájlt külön-külön ír alá — a támadó módosíthat egy fájlt és csak azt írhatja alá újra. v2 a teljes APK-t írja alá egészében — bármilyen módosítás érvényteleníti az aláírást, ami magasabb biztonsági szintet nyújt.
Play App Signing — Google Play szolgáltatás, amely központosítottan tárolja az alkalmazások distribution key-jét. A fejlesztő feltölti az upload key-jel aláírt APK-t, és a Google újraírja azt, mielőtt elküldené a felhasználóknak, így védve a kulcsot az elvesztéstől vagy ellopástól.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is