Google si impegna a far progredire equità razziale per le comunità nere. Vedi come.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

APK Signature Scheme v3

Android 9 supporta APK rotazione della chiave , che dà le applicazioni la possibilità di cambiare la loro chiave di firma come parte di un aggiornamento APK. Per rendere la rotazione pratico, APK devono indicare livelli di fiducia tra la chiave di vecchi e nuovi firma. Per supportare rotazione della chiave, abbiamo aggiornato il sistema di firma APK da v2 a v3 per consentire le chiavi vecchi e nuovi da utilizzare. V3 aggiunge informazioni sulle versioni SDK supportate e una struttura a prova di rotazione al blocco APK firma.

APK firma Block

Per mantenere la retro-compatibilità con i sono memorizzati all'interno di un APK firma Block, situato immediatamente prima della ZIP directory centrale le firme in formato APK v1, v2 e v3 APK.

L'APK v3 Firma formato Block è lo stesso di v2 . La firma v3 dell'APK viene memorizzato come una coppia ID-value con ID 0xf05368c0.

APK Signature Scheme v3 Block

Lo schema v3 è progettato per essere molto simile al regime v2 . Ha lo stesso formato generale e supporta gli stessi ID firma algoritmo , dimensioni chiave, e curve CE.

Tuttavia, lo schema v3 aggiunge informazioni sulle versioni SDK supportate e struct proof-of-rotazione.

Formato

APK Signature Scheme v3 blocco viene memorizzato all'interno della APK firma Block sotto ID 0xf05368c0 .

Il formato del APK Signature Scheme v3 Blocco consegue che di v2:

  • sequenza lunghezza prefissata di lunghezza prefissata signer :
    • di lunghezza con prefisso signed data :
      • sequenza lunghezza prefissata di lunghezza prefissa digests :
        • signature algorithm ID (4 byte)
        • digest (lunghezza prefissata)
      • sequenza lunghezza prefissa di X.509 certificates :
        • lunghezza prefissata X.509 certificate (ASN.1 forma DER)
      • minSDK (uint32) - questo firmatario dovrebbe essere ignorato se la versione della piattaforma è di sotto di questo numero.
      • maxSDK (uint32) - questo firmatario dovrebbe essere ignorato se la versione della piattaforma è di sopra di questo numero.
      • sequenza lunghezza prefissata di lunghezza prefissa additional attributes :
        • ID (uint32)
        • value (lunghezza variabile: lunghezza dell'attributo supplementare - 4 byte)
        • ID - 0x3ba06f8c
        • value - Prova di rotazione struct
    • minSDK (uint32) - duplicato di valore minSDK nella sezione dati firmati - utilizzato per ignorare la verifica di questa firma se la piattaforma corrente non è nella gamma. Deve corrispondere valore dei dati firmati.
    • maxSDK (uint32) - duplicato del valore maxSDK nella sezione dati firmati - usato per saltare la verifica di questa firma se la piattaforma corrente non è nella gamma. Deve corrispondere valore dei dati firmati.
    • sequenza lunghezza prefissata di lunghezza prefissa signatures :
      • signature algorithm ID (uint32)
      • lunghezza prefisso signature su signed data
    • lunghezza prefissata public key (SubjectPublicKeyInfo, ASN.1 forma DER)

Proof-of-rotazione e auto-fiducia-old-certs struct

La prova di rotazione struct consente alle applicazioni di ruotare loro CERT firma senza essere bloccata in altre applicazioni con cui comunicano. Per fare questo, le firme app contiene due nuovi pezzi di dati:

  • asserzione per conto terzi che cert firma della applicazione può essere attendibile ovunque i suoi predecessori sono attendibili
  • anziani certs firma di app che l'applicazione stessa ancora trust

L'attributo prova di rotazione nella sezione-dati firmati costituito da un elenco singolarmente legata, con ogni nodo che contiene un certificato di firma utilizzato per firmare le versioni precedenti dell'app. Questo attributo è destinato a contenere i proof-of-rotazione e auto-fiducia-old-certs strutture dati concettuali. L'elenco è ordinato dalla versione con il più vecchio CERT firma corrispondente al nodo radice. La struttura dei dati a prova di rotazione è costruita da avere il CERT in ciascun nodo firmare il prossimo nella lista, e impregnando quindi ogni nuova chiave con la prova che deve essere il più affidabile come la chiave più vecchio (s).

La struttura di dati auto-trusted-old-certs è costruito aggiungendo bandiere a ciascun nodo indicando la sua adesione e le proprietà nel set. Ad esempio, una bandiera può essere presente per indicare che il certificato di firma in un dato nodo è attendibile per l'ottenimento di permessi di firma Android. Questa opzione permette altre applicazioni firmate dal certificato di età per essere ancora concesso un permesso firma definito da un app firmato con il nuovo certificato di firma. Perché tutto il proof-of-rotazione risiede attributi nella sezione dati firmati del v3 signer campo, è protetto dalla chiave usata per firmare l'apk che contiene.

Questo formato esclude più chiavi di firma e convergenza di diversi certificati antenato firma a uno (più nodi di partenza per un lavandino comune).

Formato

La rotazione proof-of-viene memorizzato all'interno del Signature APK Scheme v3 Block sotto ID 0x3ba06f8c . Il suo formato è il seguente:

  • sequenza lunghezza prefissata di lunghezza prefissa levels :
    • lunghezza prefissa signed data (da CERT precedente - se esiste)
      • lunghezza prefissata X.509 certificate (ASN.1 forma DER)
      • signature algorithm ID (uint32) - algoritmo utilizzato da cert nel livello precedente
    • flags (uint32) - bandiere che indica se o non questo cert dovrebbe essere nella auto-fiducia-old-certs struct, e per le quali le operazioni.
    • signature algorithm ID (uint32) - deve corrispondere a quello della sezione di dati firmati nel livello successivo.
    • lunghezza prefisso signature nel corso degli sopra signed data

certificati multipli

Android attualmente tratta un APK firmato con più certificati come avere un'identità unica firma separata dalle certs compongono. Così, l'attributo prova di rotazione nella sezione firmato-dati forma un grafo orientato aciclico, che potrebbe essere meglio visto come un elenco singolarmente collegata, con ogni serie di adesioni per una data versione rappresenta un nodo. Questo aggiunge ulteriore complessità al struct proof-of-rotazione (versione multi-firmatario di seguito). In particolare, l'ordine diventa una preoccupazione. Cosa c'è di più, non è più possibile firmare APKs in modo indipendente, perché la struttura a prova di rotazione deve avere i vecchi certs firma firma la nuova serie di certs, piuttosto che firmare loro uno per uno. Per esempio, un APK firmato da una chiave che voglia essere firmato da due nuove chiavi B e C non poteva avere il firmatario B appena includere una firma da A o B, perché questo è un diverso identità firma di B e C. Questo sarebbe significa che le adesioni devono coordinare prima di costruire un tale struct.

Molteplici firmatari proof-of-rotazione attributo

  • sequenza lunghezza prefissata di lunghezza prefissato- sets :
    • signed data (da Precedenti - se esiste)
      • sequenza lunghezza prefissa di certificates
        • lunghezza prefissata X.509 certificate (ASN.1 forma DER)
      • Sequenza di signature algorithm IDs (uint32) - uno per ogni certificato dal set precedente, nello stesso ordine.
    • flags (uint32) - bandiere che indicano se questo insieme di certs dovrebbe essere nella auto-fiducia-old-certs struct, e per i quali le operazioni.
    • sequenza lunghezza prefissata di lunghezza prefissa signatures :
      • signature algorithm ID (uint32) - deve corrispondere a quello della sezione di dati firmati
      • lunghezza prefisso signature nel corso degli sopra signed data

antenati multipli in una prova di rotazione struct

regime v3 anche non gestisce due chiavi diverse rotanti la stessa chiave di firma per la stessa applicazione. Ciò differisce dal caso di un'acquisizione, in cui la società acquirente vorrebbe spostare l'applicazione acquisita di usare la sua chiave di firma per le autorizzazioni di condivisione. L'acquisizione è visto come un uso a causa sostenuta perché la nuova applicazione sarebbe distingue per il nome del pacchetto e può contenere un proprio struct prova di rotazione. Il caso non supportata, della stessa applicazione avere due percorsi diversi per raggiungere lo stesso CERT, rompe un sacco di ipotesi formulate nella progettazione rotazione della chiave.

Verifica

In Android 9 e superiori, APK possono essere verificati secondo l'APK Signature Scheme v3, schema v2, o schema v1. piattaforme più vecchi ignorano v3 firme e cercare di verificare le firme v2, quindi v1.

APK processo di verifica della firma

Figura processo di verifica della firma 1. APK

APK Firma verifica Scheme v3

  1. Individuare l'APK Firma Block e verificare che:
    1. Due campi grandezza naturale di APK firma Block contengono lo stesso valore.
    2. ZIP directory centrale è immediatamente seguita da CAP Fine della registrazione directory centrale.
    3. Fine ZIP di directory centrale non è seguita da ulteriori dati.
  2. Individuare il primo APK Signature Scheme v3 blocco all'interno della APK firma Block. Se il blocco v3 è presente, procedere al passo 3. Altrimenti, ricadere verifica APK utilizzando schema v2 .
  3. Per ogni signer nella firma APK Scheme v3 Block con un min e max versione SDK che si trova nella zona della piattaforma corrente:
    1. Scegli il più forte supportato signature algorithm ID da signatures . L'ordinamento di forza è fino a ogni versione implementazione / piattaforma.
    2. Verificare il corrispondente signature da signatures contro signed data utilizzando public key . (E 'ora possibile analizzare signed data .)
    3. Verificare le versioni min e max SDK nei dati firmati corrispondere a quelle specificate per il signer .
    4. Verificare che l'elenco ordinato di ID algoritmo di firma in digests e signatures è identico. (Questo per evitare che la firma di stripping / aggiunta.)
    5. Calcolare il digest dei contenuti APK utilizzando lo stesso digest algoritmo come il digest algoritmo utilizzato da l'algoritmo di firma.
    6. Verificare che il digest calcolato è identico al corrispondente digest dal digests .
    7. Verificare che SubjectPublicKeyInfo del primo certificate di certificates è identica a public key .
    8. Se esiste l'attributo prova di rotazione per il signer verificare che lo struct è valida e questo signer è l'ultimo certificato nell'elenco.
  4. Verifica ha esito positivo se esattamente un signer è stato trovato nella gamma della piattaforma attuale e il punto 3 è riuscito per questo signer .

Validazione

Per testare il dispositivo supporta v3 correttamente, eseguire i PkgInstallSignatureVerificationTest.java test CTS in cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .