Code Signing (Codesignatur) ist ein Mechanismus zur digitalen Signatur von ausführbaren Dateien, der die Authentizität des Entwicklers und die Integrität der Anwendung gewährleistet. In Android muss jede APK-Datei vor der Installation auf einem Gerät oder der Veröffentlichung im Google Play Store mit einem Zertifikat signiert werden. Laut Google, 2024 unterstützt Android vier Generationen von Signaturschemata: von v1 basierend auf JAR bis v4 für Streaming-Installation.
Wichtige Punkte
Code Signing ist ein kryptografischer Prozess, bei dem der Entwickler ausführbaren Code mit seinem digitalen Zertifikat signiert. Die Signatur wird mit asymmetrischer Verschlüsselung erstellt: Der private Schlüssel des Entwicklers erzeugt eine digitale Signatur, und der öffentliche Schlüssel wird in das Zertifikat eingebettet. Jeder kann die Signatur mit dem öffentlichen Schlüssel überprüfen, aber den Code zu ändern, ohne die Signatur zu brechen, ist unmöglich.
In der mobilen Entwicklung erfüllt die Codesignatur drei Funktionen. Erstens — Authentifizierung: Der Benutzer und die Plattform können den Anwendungsentwickler identifizieren. Zweitens — Integrität: Jede Änderung der APK nach der Signatur macht die Signatur ungültig. Drittens — vertrauenswürdige Updates: Die Plattform erlaubt nur Updates mit APKs, die mit demselben Zertifikat wie die installierte Version signiert sind.
Die digitale Signatur von Android-Anwendungen hat rechtliche Bedeutung. Nach russischem Recht (63-FZ) und der europäischen eIDAS ist eine qualifizierte elektronische Signatur einer handschriftlichen Unterschrift gleichgestellt. Allerdings ist die Signatur einer APK mit einem selbstsignierten Zertifikat (übliche Praxis in Android) nicht qualifiziert — sie bestätigt die Integrität, aber nicht die Identität des Entwicklers aus rechtlicher Sicht.
Android unterstützt vier APK-Signaturschemata, die jeweils die Probleme der vorherigen Version lösen und neue Funktionen hinzufügen. Alle Schemata können in einer einzigen APK koexistieren — dies ist für die Abwärtskompatibilität mit älteren Android-Versionen erforderlich.
Das v1 (JAR-Signing)-Schema erschien in Android 1.0. Es signiert einzelne Dateien innerhalb des APK-Archivs mit Einträgen in META-INF/MANIFEST.MF. Der Nachteil: Ein Angreifer kann die APK ändern (Dateien hinzufügen oder entfernen) und nur die geänderten Dateien neu signieren, ohne den Rest zu berühren. Dies macht v1 anfällig für bestimmte Angriffe. Das v2 (APK Signature Scheme), eingeführt in Android 7.0, signiert die gesamte APK-Datei als Ganzes, einschließlich aller Bytes außer der Signatur selbst, und eliminiert so die Möglichkeit einer selektiven Modifikation.
| Schema | Android | Eigenschaft | Schlüsselrotation |
|---|---|---|---|
| v1 (JAR) | 1.0+ | Signatur pro Datei | Nein |
| v2 | 7.0+ | Vollständige APK-Signatur | Nein |
| v3 | 9.0+ | Signatur + Rotation | Ja |
| v4 | 11.0+ | Streaming + ADB | Ja |
Das in Android 9.0 eingeführte Schema v3 löst ein langjähriges Problem: Was tun, wenn der Signaturschlüssel kompromittiert ist oder abläuft? Früher bedeutete ein Wechsel des Signaturschlüssels, dass die Anwendung als neu behandelt wurde — sie konnte nicht über einer vorhandenen installiert werden. v3 fügt einen Rotations-Mechanismus hinzu: Die APK kann einen Rotationsnachweis (proof-of-rotation) enthalten, der mit dem alten Schlüssel signiert ist. Das System überprüft die Kette und erlaubt das Update der mit dem neuen Schlüssel signierten Anwendung.
Keystore ist ein sicherer Container, der private Schlüssel und Zertifikate zum Signieren von Anwendungen enthält. In der Android-Entwicklung wird das JKS-Format (Java KeyStore) oder PKCS12 verwendet. Der Keystore wird mit dem Dienstprogramm keytool erstellt, das Teil des JDK ist. Jeder Schlüssel im Speicher wird durch einen Alias identifiziert und durch ein Passwort geschützt.
Das Zertifikat in einem Keystore enthält den öffentlichen Schlüssel und Informationen über den Eigentümer: Organisationsname, Land, Gültigkeitsdauer. Für Android-Anwendungen kann das Zertifikat selbstsigniert sein — Google verlangt keine Zertifizierungsstelle (CA), was Android von iOS unterscheidet. Die Gültigkeitsdauer des Zertifikats muss jedoch mindestens 25 Jahre betragen, da die Anwendung mit demselben Schlüssel aktualisiert wird.
# Erstellen eines neuen Keystores für die Signatur
keytool -genkey -v -keystore my-release.keystore \
-alias my-app-alias \
-keyalg RSA \
-keysize 2048 \
-validity 10000
# Anzeigen des Keystore-Inhalts
keytool -list -v -keystore my-release.keystore
Android unterstützt zwei Algorithmen für Signaturschlüssel: RSA und ECDSA. RSA mit einer Schlüsselgröße von 2048 Bit ist der De-facto-Standard, der von allen Android-Versionen unterstützt wird. ECDSA (Elliptic Curve Digital Signature Algorithm) mit der Kurve P-256 bietet die gleiche kryptografische Stärke bei kleinerer Schlüsselgröße. Seit Android 9.0 wird ECDSA empfohlen, da es bei der Verifikation auf mobilen Geräten schneller ist.
Im Android Gradle Plugin wird die Signatur über den Block signingConfigs in der build.gradle auf Modulebene konfiguriert. Für Debug-Builds erstellt Android Studio automatisch einen Debug-Keystore mit bekannten Passwörtern. Für Release-Builds gibt der Entwickler den Pfad zu seinem Keystore, den Schlüssel-Alias und die Passwörter an. Es wird empfohlen, Passwörter in separaten Konfigurationsdateien zu speichern, die aus der Versionskontrolle ausgeschlossen sind.
Eine moderne Praxis ist die zentrale Signaturverwaltung über CI/CD. Jenkins, GitLab CI oder GitHub Actions können den Keystore als geschütztes Artefakt und Passwörter als Umgebungsgeheimnisse speichern. Dies verhindert Schlüssellecks über das Repository und vereinfacht die Schlüsselrotation bei Bedarf.
// build.gradle (App-Ebene) — Signaturkonfiguration
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
}
}
}
Für maximale Kompatibilität sollte eine APK mit allen drei Schemata (v1 + v2 + v3) signiert werden. Das Android Gradle Plugin standardmäßig alle Schemata ein. Nur mit v2 signierte APKs werden auf Android 6.0 und darunter nicht installiert. APKs nur mit v1 erhalten auf Android 7.0+ nicht die Integritätsvorteile von v2. Das Einbeziehen aller Schemata erhöht die APK-Größe um nicht mehr als 1–2 % und gewährleistet die Kompatibilität mit jedem Gerät.
Play App Signing ist ein Google Play-Dienst, der die Signaturschlüssel von Anwendungen zentral verwaltet. Der Entwickler lädt eine mit einem Upload-Schlüssel (upload key) signierte APK in die Google Play Console hoch, und Google Play signiert sie mit einem Verteilungsschlüssel (distribution key) neu, bevor sie an die Benutzer ausgeliefert wird. Dies schützt den Verteilungsschlüssel vor Verlust oder Kompromittierung.
Vorteile von Play App Signing: Sicherheit — der Verteilungsschlüssel wird in Googles geschütztem Speicher aufbewahrt; Rotation — ein Schlüsselwechsel kann über die Konsole beantragt werden; Wiederherstellung — bei Verlust des Upload-Schlüssels kann ein neuer generiert werden. Nachteil: Für Anwendungen, die vor der Einführung von Play App Signing existierten, erfordert die Migration die Erstellung einer neuen Anwendung, da der alte Verteilungsschlüssel bereits verwendet wird.
# Abrufen des Zertifikatsfingerabdrucks (SHA-256)
keytool -list -v -keystore my-release.keystore \
-alias my-app-alias | grep "SHA256"
# Überprüfen der APK-Signatur mit apksigner
apksigner verify --verbose app-release.apk
Wenn der Signaturschlüssel verloren geht und Play App Signing nicht verwendet wird, ist es unmöglich, die Möglichkeit zum Aktualisieren der Anwendung wiederherzustellen — es muss eine neue Anwendung mit einem neuen Paketnamen erstellt werden. Dies ist einer der Hauptgründe für die Verwendung von Play App Signing. Google empfiehlt, eine Sicherungskopie des Keystores in einem sicheren Offline-Speicher (verschlüsseltes USB-Laufwerk, Bankschließfach) aufzubewahren.
Bei der Installation einer APK führt Android eine Signaturverifikation in mehreren Schritten durch. Erstens — Zertifikatsprüfung: ob die Gültigkeit abgelaufen ist und das Format korrekt ist. Zweitens — Signaturverifikation: ob die kryptografische Signatur mit dem APK-Inhalt übereinstimmt. Drittens — Zertifikatsvergleich mit der installierten Version: wenn die Anwendung bereits auf dem Gerät vorhanden ist, muss das Zertifikat übereinstimmen, andernfalls wird die Installation blockiert.
Das Verifikationssystem ist in den PackageManagerService integriert. Bei der Verarbeitung einer Installationsanfrage extrahiert PMS die Signatur aus der APK, verifiziert sie mit der Klasse android.util.PackageParser und vergleicht sie mit der gespeicherten Signatur der installierten Anwendung (falls vorhanden). Bei Nichtübereinstimmung erhält der Benutzer den Fehler „INSTALL_FAILED_UPDATE_INCOMPATIBLE“. Dieser Mechanismus verhindert Ersetzungsangriffe (Malware kann eine legitime Anwendung nicht durch ihre eigene Version ersetzen).
Ein Entwickler kann die APK-Signatur unabhängig mit dem Dienstprogramm apksigner aus den Android SDK Build Tools überprüfen. Der Befehl apksigner verify --verbose app.apk zeigt, mit welchen Schemata die APK signiert ist, ob die Zertifikate gültig sind und ob die Signaturen mit dem Inhalt übereinstimmen. Für die programmatische Überprüfung der Signatur einer installierten Anwendung wird PackageManager.getPackageInfo() mit dem Flag GET_SIGNATURES verwendet.
// Programmatische Signaturprüfung einer installierten Anwendung
fun getAppSignature(context: Context, packageName: String): String? {
val pm = context.packageManager
val info = pm.getPackageInfo(
packageName,
PackageManager.GET_SIGNATURES
)
return info.signatures?.firstOrNull()?.toCharsString()
}
Die Sicherheit des Signaturschlüssels ist ein kritischer Aspekt der Android-Entwicklung. Die Kompromittierung des Schlüssels ermöglicht es einem Angreifer, Updates Ihrer Anwendung mit seinem eigenen Code zu signieren. Die Hauptregeln: Speichern Sie den Schlüssel niemals in einem Repository, verwenden Sie nicht denselben Schlüssel für verschiedene Anwendungen, übertragen Sie den Schlüssel nicht über unsichere Kanäle (E-Mail, Messenger).
Die empfohlene Praxis ist die Schlüsseltrennung. Verwenden Sie einen separaten Schlüssel für jede Anwendung und einen separaten Schlüssel für den Upload zu Google Play (upload key). Für Debug-Builds erstellt Android Studio einen gemeinsamen debug.keystore — dieser darf nicht für Release-Builds verwendet werden. Die Gültigkeitsdauer des Zertifikats sollte 25–30 Jahre betragen (aktueller Standard, bestätigt durch Google).
| Praxis | Empfehlung |
|---|---|
| Schlüsselspeicherung | Verschlüsselter Datenträger, CI/CD-Secrets |
| Zertifikatsgültigkeit | Mindestens 25 Jahre |
| Algorithmus | RSA 2048+ oder ECDSA P-256 |
| Trennung | Separater Schlüssel pro Anwendung |
| Backup | Offline-Kopie des Keystores |
Überprüfen Sie regelmäßig die Integrität der Signaturkette. Wenn Mitarbeiter mit Schlüsselzugriff das Unternehmen verlassen, aktualisieren Sie den Upload-Schlüssel über die Google Play Console. Verwenden Sie Tools wie die Google Play Integrity API, um zu überprüfen, ob Ihre Anwendung auf Benutzergeräten nicht manipuliert wurde. Die API gibt Daten über Signatur und Integrität zurück und sendet sie zur Überprüfung an den Server.
Häufig gestellte Fragen
Code Signing ist eine digitale Signatur einer APK-Datei, die bestätigt, dass die Anwendung von einem bestimmten Entwickler erstellt wurde und nach der Signatur nicht verändert wurde. Ohne Signatur wird die APK nicht auf einem Gerät installiert.
Verwenden Sie das Dienstprogramm keytool aus dem JDK: keytool -genkey -v -keystore my-release.keystore -alias my-alias -keyalg RSA -keysize 2048 -validity 10000. Geben Sie den resultierenden Keystore in der build.gradle im Block signingConfigs an.
Wenn der Schlüssel verloren geht und Sie kein Play App Signing verwenden, wird die Aktualisierung der Anwendung unmöglich. Sie müssen eine neue Anwendung im Google Play Store mit einem neuen Paketnamen erstellen. Verwenden Sie Play App Signing zum Schutz vor Schlüsselverlust.
v1 signiert jede Datei innerhalb der APK einzeln — ein Angreifer kann eine Datei ändern und nur diese neu signieren. v2 signiert die gesamte APK als Ganzes — jede Änderung macht die Signatur ungültig, was ein höheres Sicherheitsniveau bietet.
Play App Signing ist ein Google Play-Dienst, der den Verteilungsschlüssel von Anwendungen zentral speichert. Der Entwickler lädt eine mit einem Upload-Schlüssel signierte APK hoch, und Google signiert sie vor der Auslieferung an die Benutzer neu, wodurch der Schlüssel vor Verlust oder Diebstahl geschützt wird.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch