Verifica le coppie di chiavi supportate da hardware con attestazione della chiave

L'attestazione delle chiavi ti offre una maggiore sicurezza che le chiavi utilizzate nella tua app siano archiviate nell'archivio chiavi supportato dall'hardware di un dispositivo. Le sezioni seguenti descrivono come verificare le proprietà delle chiavi basate su hardware e come interpretarne i dati di estensione dei certificati di attestazione.

Nota: prima di verificare le proprietà delle chiavi con supporto hardware di un dispositivo in un ambiente di produzione, assicurati che il dispositivo supporti l'attestazione delle chiavi a livello hardware. A tale scopo, verifica che la catena di certificati di attestazione contenga un certificato radice che sia firmato con la chiave radice di attestazione di Google e che l'elemento attestationSecurityLevel all'interno della struttura di dati della descrizione della chiave sia impostato sul livello di sicurezza TrustedEnvironment o sul livello di sicurezza StrongBox.

Inoltre, è importante verificare le firme nella catena di certificati e confermare che nessuna delle chiavi della catena sia stata revocata controllando l'elenco degli stati di revoca del certificato. A meno che non siano tutte valide e la radice non sia la chiave principale di Google, non fidarti completamente dell'attestazione. Tieni presente, tuttavia, che i dispositivi contenenti certificati revocati sono comunque affidabili almeno quanto i dispositivi che supportano solo l'attestazione del software. Un'attestazione completamente valida è un ottimo indicatore positivo. Se non ne hai uno, è un indicatore neutro, non negativo.

Recuperare e verificare una coppia di chiavi con supporto hardware

Durante l'attestazione delle chiavi, specifichi l'alias di una coppia di chiavi e ne recuperi la catena di certificati, che puoi utilizzare per verificare le proprietà della coppia di chiavi.

Se il dispositivo supporta l'attestazione delle chiavi a livello hardware, il certificato radice all'interno di questa catena è firmato utilizzando una chiave radice di attestazione di cui è stato eseguito il provisioning in modo sicuro nel keystore basato su hardware del dispositivo.

Nota:sui dispositivi forniti con attestazione della chiave a livello di hardware, Android 7.0 (livello API 24) o versioni successive e Google Play Services, il certificato radice viene firmato con la chiave radice di attestazione di Google. Verifica che questo certificato radice sia tra quelli elencati nella sezione relativa ai certificati radice.

Per implementare l'attestazione delle chiavi, completa i seguenti passaggi:

  1. Utilizza il metodo getCertificateChain() di un oggetto KeyStore per ottenere un riferimento alla catena di certificati X.509 associati al keystore basato sull'hardware.
  2. Invia i certificati a un server separato che ritieni attendibile per la convalida.

    Attenzione: non completare la seguente procedura di convalida sullo stesso dispositivo del KeyStore. Se il sistema Android sul dispositivo è compromesso, la procedura di convalida potrebbe considerare attendibile qualcosa che non lo è.

  3. Ottieni un riferimento alla libreria di analisi e convalida della catena di certificati X.509 più appropriata per il tuo set di strumenti. Verifica che il certificato pubblico radice sia attendibile e che ogni certificato firmi il certificato successivo della catena.

  4. Controlla lo stato di revoca di ciascun certificato per assicurarti che nessuno sia stato revocato.

  5. (Facoltativo) Controlla l'estensione del certificato delle informazioni di provisioning che è presente solo nelle catene di certificati più recenti.

    Ottieni un riferimento alla libreria del parser CBOR più appropriata per il tuo set di strumenti. Trova il certificato più vicino al certificato radice che contiene l'estensione del certificato per le informazioni di provisioning. Utilizza l'analizzatore sintattico per estrarre i dati dell'estensione del certificato di informazioni sul provisioning da quel certificato.

    Per ulteriori dettagli, consulta la sezione relativa allo schema dei dati dell'estensione delle informazioni di provisioning.

  6. Ottieni un riferimento alla libreria di parser ASN.1 più appropriata per il tuo set di strumenti. Trova il certificato più vicino al certificato radice che contiene l'estensione del certificato di attestazione della chiave. Se l'estensione del certificato delle informazioni di provisioning era presente, l'estensione del certificato di attestazione della chiave deve trovarsi nel certificato immediatamente successivo. Utilizza il parser per estrarre i dati dell'estensione del certificato di attestazione della chiave dal certificato.

    Attenzione:non dare per scontato che l'estensione del certificato di attestazione della chiave si trovi nel certificato foglia della catena. Puoi considerare attendibile solo la prima occorrenza dell'estensione nella catena. Eventuali altre istanze dell'estensione non sono state emesse dall'hardware sicuro e potrebbero essere state emesse da un malintenzionato che ha esteso la catena nel tentativo di creare attestazioni false per chiavi non attendibili.

    Il Sample di attestazione della chiave utilizza l'analizzatore sintattico ASN.1 di Bouncy Castle per estrarre i dati di estensione di un certificato di attestazione. Puoi utilizzare questo esempio come riferimento per creare il tuo parser.

    Per ulteriori dettagli, consulta la sezione sullo schema dei dati delle estensioni di attestazione della chiave.

  7. Controlla la coerenza dei dati dell'estensione che hai recuperato nei passaggi precedenti e confrontali con l'insieme di valori che prevedi che la chiave con supporto hardware contenga.

Certificati radice

L'attendibilità dell'attestazione dipende dal certificato radice della catena. I dispositivi Android che hanno superato i test necessari per avere la suite di app Google, tra cui Google Play, e che sono stati lanciati con Android 7.0 (livello API 24) o versioni successive devono utilizzare le chiavi di attestazione firmate dal certificato principale di attestazione dell'hardware di Google. Tieni presente che l'attestazione non era richiesta fino ad Android 8.0 (livello API 26). La chiave pubblica principale è la seguente:

  -----BEGIN PUBLIC KEY-----
  MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xU
  FmOr75gvMsd/dTEDDJdSSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5j
  lRfdnJLmN0pTy/4lj4/7tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y
  //0rb+T+W8a9nsNL/ggjnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73X
  pXyTqRxB/M0n1n/W9nGqC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYI
  mQQcHtGl/m00QLVWutHQoVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB
  +TxywElgS70vE0XmLD+OJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7q
  uvmag8jfPioyKvxnK/EgsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgp
  Zrt3i5MIlCaY504LzSRiigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7
  gLiMm0jhO2B6tUXHI/+MRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82
  ixPvZtXQpUpuL12ab+9EaDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+
  NpUFgNPN9PvQi8WEg5UmAGMCAwEAAQ==
  -----END PUBLIC KEY-----
Certificati radice emessi in precedenza
    -----BEGIN CERTIFICATE-----
    MIIFYDCCA0igAwIBAgIJAOj6GWMU0voYMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
    BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTYwNTI2MTYyODUyWhcNMjYwNTI0MTYy
    ODUyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
    AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
    Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
    tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
    nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
    C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
    oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
    JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
    sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
    igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
    RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
    aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
    AGMCAwEAAaOBpjCBozAdBgNVHQ4EFgQUNmHhAHyIBQlRi0RsR/8aTMnqTxIwHwYD
    VR0jBBgwFoAUNmHhAHyIBQlRi0RsR/8aTMnqTxIwDwYDVR0TAQH/BAUwAwEB/zAO
    BgNVHQ8BAf8EBAMCAYYwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cHM6Ly9hbmRyb2lk
    Lmdvb2dsZWFwaXMuY29tL2F0dGVzdGF0aW9uL2NybC8wDQYJKoZIhvcNAQELBQAD
    ggIBACDIw41L3KlXG0aMiS//cqrG+EShHUGo8HNsw30W1kJtjn6UBwRM6jnmiwfB
    Pb8VA91chb2vssAtX2zbTvqBJ9+LBPGCdw/E53Rbf86qhxKaiAHOjpvAy5Y3m00m
    qC0w/Zwvju1twb4vhLaJ5NkUJYsUS7rmJKHHBnETLi8GFqiEsqTWpG/6ibYCv7rY
    DBJDcR9W62BW9jfIoBQcxUCUJouMPH25lLNcDc1ssqvC2v7iUgI9LeoM1sNovqPm
    QUiG9rHli1vXxzCyaMTjwftkJLkf6724DFhuKug2jITV0QkXvaJWF4nUaHOTNA4u
    JU9WDvZLI1j83A+/xnAJUucIv/zGJ1AMH2boHqF8CY16LpsYgBt6tKxxWH00XcyD
    CdW2KlBCeqbQPcsFmWyWugxdcekhYsAWyoSf818NUsZdBWBaR/OukXrNLfkQ79Iy
    ZohZbvabO/X+MVT3rriAoKc8oE2Uws6DF+60PV7/WIPjNvXySdqspImSN78mflxD
    qwLqRBYkA3I75qppLGG9rp7UCdRjxMl8ZDBld+7yvHVgt1cVzJx9xnyGCC23Uaic
    MDSXYrB4I4WHXPGjxhZuCuPBLTdOLU8YRvMYdEvYebWHMpvwGCF6bAx3JBpIeOQ1
    wDB5y0USicV3YgYGmi+NZfhA4URSh77Yd6uuJOJENRaNVTzk
    -----END CERTIFICATE-----
  
    -----BEGIN CERTIFICATE-----
    MIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
    BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz
    NzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
    AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
    Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
    tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
    nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
    C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
    oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
    JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
    sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
    igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
    RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
    aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
    AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
    IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
    VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu
    XKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U
    h6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno
    L/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok
    QBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA
    D32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI
    mMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW
    Fua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91
    oeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o
    jm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB
    ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH
    ex0SdDrx+tWUDqG8At2JHA==
    -----END CERTIFICATE-----
  
    -----BEGIN CERTIFICATE-----
    MIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
    BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx
    MDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
    AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
    Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
    tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
    nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
    C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
    oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
    JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
    sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
    igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
    RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
    aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
    AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
    IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
    VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG
    zWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan
    63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T
    QH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ
    erGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL
    Zez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a
    0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH
    7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b
    HQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w
    lZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2
    Ob3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7
    mD/vFDkzF+wm7cyWpQpCVQ==
    -----END CERTIFICATE-----
  
    -----BEGIN CERTIFICATE-----
    MIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
    BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw
    NzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
    AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
    Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
    tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
    nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
    C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
    oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
    JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
    sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
    igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
    RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
    aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
    AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
    IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
    VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7
    174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC
    W/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G
    tkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx
    oSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG
    1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF
    mr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz
    lHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw
    n6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu
    zbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo
    vaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn
    w1IdYIg2Wxg7yHcQZemFQg==
    -----END CERTIFICATE-----
  

Se il certificato principale nella catena di attestazione che ricevi contiene questa chiave pubblica e nessuno dei certificati della catena è stato revocato, sai che:

  1. La tua chiave si trova in hardware che Google ritiene sicuro.
  2. Ha le proprietà descritte nel certificato di attestazione.

Se la catena di attestazione contiene un'altra chiave pubblica principale, Google non fa alcuna dichiarazione sulla sicurezza dell'hardware. Ciò non significa che la chiave sia compromessa, ma solo che la certificazione non dimostra che la chiave si trovi in hardware sicuro. Regola le tue ipotesi di sicurezza di conseguenza.

Se il certificato radice non contiene la chiave pubblica in questa pagina, i motivi possibili sono due:

  • Molto probabilmente, il dispositivo è stato avviato con una versione di Android precedente alla 7.0 e non supporta l'attestazione hardware. In questo caso, Android ha un'implementazione software dell'attestazione che produce lo stesso tipo di certificato di attestazione, ma firmato con una chiave hardcoded nel codice sorgente di Android. Poiché questa chiave di firma non è una chiave privata, l'attestazione potrebbe essere stata creata da un malintenzionato che finge di fornire hardware sicuro.
  • L'altro motivo probabile è che il dispositivo non è un dispositivo Google Play. In questo caso, il produttore del dispositivo è libero di creare il proprio root e di effettuare qualsiasi dichiarazione preferita sul significato dell'attestazione. Consulta la documentazione del produttore del dispositivo. Tieni presente che, al momento della stesura di questo articolo, Google non è a conoscenza di produttori di dispositivi che abbiano adottato questa pratica.

Elenco dello stato della revoca del certificato

Le chiavi di attestazione possono essere revocate per una serie di motivi, tra cui manipolazione o estrazione sospetta da parte di un malintenzionato. Pertanto, è fondamentale che lo stato di ogni certificato in una catena di attestazione venga controllato in base all'elenco ufficiale dello stato di revoca del certificato (CRL). Questo elenco è gestito da Google e pubblicato all'indirizzo: https://android.googleapis.com/attestation/status. L'intestazione Cache-Control nella risposta HTTP determina la frequenza con cui controllare la presenza di aggiornamenti, pertanto non è richiesta una richiesta di rete per ogni certificato da verificare. Questo URL restituisce un file JSON contenente lo stato di revoca di tutti i certificati che non hanno un normale stato valido. Il formato del file JSON è conforme alla seguente definizione di schema JSON (bozza 07):

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "entries": {
      "description" : "Each entry represents the status of an attestation key. The dictionary-key is the certificate serial number in lowercase hex.",
      "type": "object",
      "propertyNames": {
        "pattern": "^[a-f1-9][a-f0-9]*$"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "status": {
            "description": "[REQUIRED] Current status of the key.",
            "type": "string",
            "enum": ["REVOKED", "SUSPENDED"]
          },
          "expires": {
            "description": "[OPTIONAL] UTC date when certificate expires in ISO8601 format (YYYY-MM-DD). Can be used to clear expired certificates from the status list.",
            "type": "string",
            "format": "date"
          },
          "reason": {
            "description": "[OPTIONAL] Reason for the current status.",
            "type": "string",
            "enum": ["UNSPECIFIED", "KEY_COMPROMISE", "CA_COMPROMISE", "SUPERSEDED", "SOFTWARE_FLAW"]
          },
          "comment": {
            "description": "[OPTIONAL] Free form comment about the key status.",
            "type": "string",
            "maxLength": 140
          }
        },
        "required": ["status"],
        "additionalProperties": false
      }
    }
  },
  "required": ["entries"],
  "additionalProperties": false
}

Esempio di CRL:

{
  "entries": {
    "2c8cdddfd5e03bfc": {
      "status": "REVOKED",
      "expires": "2020-11-13",
      "reason": "KEY_COMPROMISE",
      "comment": "Key stored on unsecure system"
    },
    "c8966fcb2fbb0d7a": {
      "status": "SUSPENDED",
      "reason": "SOFTWARE_FLAW",
      "comment": "Bug in keystore causes this key malfunction b/555555"
    }
  }
}

Schema dei dati dell'estensione attestazione chiave

L'estensione attestazione della chiave ha l'OID 1.3.6.1.4.1.11129.2.1.17. L'estensione memorizza le informazioni in base a uno schema ASN.1.

L'elenco seguente presenta una descrizione di ogni elemento all'interno dello schema:

Descrizione chiave

Questa sequenza di valori presenta informazioni generali sulla coppia di chiavi verificata tramite l'attestazione della chiave e fornisce un facile accesso a dettagli aggiuntivi.

attestationVersion
La versione della funzionalità di attestazione della chiave.
ValoreVersione
1Keymaster versione 2.0
2Keymaster versione 3.0
3Versione Keymaster 4.0
4Versione Keymaster 4.1
100KeyMint versione 1.0
200KeyMint versione 2.0
300KeyMint versione 3.0
attestationSecurityLevel

Il livello di sicurezza dell'attestazione.

Avviso: anche se è possibile autenticare le chiavi memorizzate nel sistema Android, ovvero se il valore di attestationSecurityLevel è impostato su Software, non puoi considerare attendibili queste attestazioni se il sistema Android viene compromesso.

keymasterVersion/keyMintVersion
La versione dell'Hardware Abstraction Layer (HAL) Keymaster o KeyMint.
ValoreVersione
0Keymaster versione 0.2 o 0.3
1Keymaster versione 1.0
2Keymaster versione 2.0
3Keymaster versione 3.0
4Versione Keymaster 4.0
41Keymaster versione 4.1
100KeyMint versione 1.0
200KeyMint versione 2.0
300KeyMint versione 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Il livello di sicurezza dell'implementazione di Keymaster/KeyMint.
attestationChallenge
Contiene la sfida fornita al momento della creazione della chiave. Verifica che questo valore corrisponda al valore fornito dal server, come memorizzato nel tag di autorizzazione Tag::ATTESTATION_CHALLENGE. In caso contrario, il servizio potrebbe essere vulnerabile alla riproduzione dei certificati di attestazione precedenti.
uniqueId
Questo valore identifica il dispositivo, ma solo per un periodo di tempo limitato. Viene calcolata e viene utilizzata solo dalle app di sistema. In tutte le altre app, uniqueId è vuoto.
softwareEnforced
(Facoltativo) L'elenco di autorizzazioni di Keymaster/KeyMint applicato dal sistema Android, non dal Trusted Execution Environment (TEE) del dispositivo. Le informazioni in questo elenco di autorizzazioni vengono raccolte o generate dal codice che fa parte della piattaforma e sono archiviate nella partizione di sistema del dispositivo. I contenuti di questo elenco di autorizzazioni possono essere considerati attendibili a condizione che sul dispositivo sia in esecuzione un sistema operativo conforme al modello di sicurezza della piattaforma Android. Tutti i dispositivi Android certificati sono conformi a questo modello di sicurezza, pertanto se il dispositivo è bloccato e lo stato di avvio verificato è Verified, i valori indicati qui dovrebbero essere affidabili. Su un dispositivo modificato, in cui il bootloader è sbloccato, l'utente può installare un sistema operativo non conforme al modello di sicurezza della piattaforma Android, pertanto i valori in questo campo potrebbero essere scelti arbitrariamente dall'utente.
hardwareEnforced
Facoltativo. L'elenco di autorizzazioni di Keymaster/KeyMint applicato dal Trusted Execution Environment (TEE) del dispositivo. Le informazioni in questo elenco di autorizzazioni vengono raccolte o generate da codice che fa parte dell'hardware sicuro e non è controllato dalla piattaforma. Ad esempio, le informazioni in questo elenco di autorizzazioni provengono dal bootloader del dispositivo o dal TEE in esecuzione sul dispositivo. I campi in questo elenco di autorizzazioni che non sono impostati direttamente da KeyMint sono forniti da altre parti dell'hardware sicuro (ad esempio il bootloader) tramite canali di comunicazione sicuri che non richiedono la convalida della piattaforma. La distinzione tra l'hardware sicuro e il sistema Android è che l'utente non può modificare il codice in esecuzione nell'hardware sicuro (il firmware), quindi l'utente non può sovvertire i valori in questo elenco di autorizzazioni.

SecurityLevel

Questa struttura di dati indica il grado in cui una funzionalità software, ad esempio una coppia di chiavi, è protetta in base alla sua posizione all'interno del dispositivo.

Poiché la struttura di dati è un'enumerazione, assume esattamente uno dei seguenti valori:

Archivio chiavi
La logica per la creazione e la gestione della funzionalità è implementata nel sistema Android. Ai fini di creare e archiviare coppie di chiavi, questa posizione è meno sicura del TEE, ma è più sicura dello spazio di processo dell'app.
TrustedEnvironment
La logica per la creazione e la gestione della funzionalità è implementata in un hardware sicuro, ad esempio un TEE. Ai fini della creazione e della memorizzazione delle coppie di chiavi, questa posizione è più sicura perché l'hardware sicuro è altamente resistente alla compromissione da remoto.
StrongBox
La logica per la creazione e la gestione della funzionalità è implementata in un modulo di sicurezza hardware dedicato. Ai fini della creazione e della memorizzazione delle coppie di chiavi, questa posizione è più sicura perché è altamente resistente alla compromissione da remoto e agli attacchi hardware contro il modulo.
Software
La logica per la creazione e la gestione della funzionalità è implementata in un'implementazione di KeyMint o Keymaster che non viene eseguita in un ambiente sicuro. Ai fini della creazione e della memorizzazione delle coppie di chiavi, questa posizione è meno sicura del TEE, ma più sicura dello spazio dei processi dell'app.

AuthorizationList

Questa struttura di dati contiene le proprietà della coppia di chiavi stesse, come definito nel Keymaster o nel KeyMint Hardware Astrazione Layer (HAL). Confronta questi valori con lo stato attuale del dispositivo o con un insieme di valori previsti per verificare che una coppia di chiavi sia ancora valida per l'utilizzo nella tua app.

Ogni nome di campo corrisponde a un tag di autorizzazione Keymaster/KeyMint con nome simile. Ad esempio, il campo keySize in un elenco di autorizzazioni corrisponde al tag di autorizzazione Tag::KEY_SIZE.

La specifica dell'interfaccia AIDL contiene le informazioni definitive sui tag di autorizzazione. Questa opzione definisce il valore ID e il tipo di ogni tag, nonché se ogni tag deve essere presente nell'elenco delle autorizzazioni hardwareEnforced (indicando che il tag viene applicato nell'ambiente sicuro) o nell'elenco delle autorizzazioni softwareEnforced (indicando che il tag è applicato da Android, in genere da un archivio chiavi).

Ogni campo nel seguente elenco è facoltativo:

purpose
Corrisponde al tag di autorizzazione Tag::PURPOSE, che utilizza un valore ID tag di 1.
algorithm

Corrisponde al Tag::ALGORITHM tag di autorizzazione, che utilizza un valore ID tag pari a 2.

In un oggetto AuthorizationList di attestazione, il valore dell'algoritmo è sempre RSA o EC.

keySize
Corrisponde al tag di autorizzazione Tag::KEY_SIZE, che utilizza un valore ID tag pari a 3.
digest
Corrisponde al tag di autorizzazione Tag::DIGEST, che utilizza un valore ID tag di 5.
padding
Corrisponde al tag di autorizzazione Tag::PADDING, che utilizza un valore ID tag di 6.
ecCurve

Corrisponde al Tag::EC_CURVE tag di autorizzazione, che utilizza un valore ID tag pari a 10.

L'insieme di parametri utilizzati per generare una coppia di chiavi ellittiche (EC), che utilizza ECDSA per la firma e la verifica, all'interno del keystore di sistema Android.

rsaPublicExponent
Corrisponde al tag di autorizzazione Tag::RSA_PUBLIC_EXPONENT, che utilizza un valore ID tag pari a 200.
mgfDigest

Presente solo nella versione dell'attestazione della chiave >= 100.

Corrisponde al Tag::RSA_OAEP_MGF_DIGEST tag di autorizzazione KeyMint , che utilizza un valore ID tag pari a 203.
rollbackResistance

Presente solo nella versione dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::ROLLBACK_RESISTANT, che utilizza il valore ID tag 303.

earlyBootOnly

Presente solo nella versione dell'attestazione della chiave >= 4.

Corrisponde al tag di autorizzazione Tag::EARLY_BOOT_ONLY, che utilizza un valore ID tag pari a 305.

activeDateTime
Corrisponde al tag di autorizzazione Tag::ACTIVE_DATETIME, che utilizza un valore ID tag pari a 400.
originationExpireDateTime
Corrisponde al tag di autorizzazione Keymaster Tag::ORIGINATION_EXPIRE_DATETIME, che utilizza un valore ID tag pari a 401.
usageExpireDateTime
Corrisponde al tag di autorizzazione Tag::USAGE_EXPIRE_DATETIME, che utilizza il valore ID tag 402.
usageCountLimit
Corrisponde al tag di autorizzazione Tag::USAGE_COUNT_LIMIT, che utilizza un valore ID tag pari a 405.
noAuthRequired

Corrisponde al Tag::NO_AUTH_REQUIRED tag di autorizzazione, che utilizza un valore ID tag pari a 503.

userAuthType
Corrisponde al tag di autorizzazione Tag::USER_AUTH_TYPE, che utilizza un valore ID tag pari a 504.
authTimeout
Corrisponde al tag di autorizzazione Tag::AUTH_TIMEOUT, che utilizza un valore ID tag pari a 505.
allowWhileOnBody

Corrisponde al Tag::ALLOW_WHILE_ON_BODY tag di autorizzazione, che utilizza un valore ID tag pari a 506.

Consente di utilizzare la chiave dopo il periodo di timeout dell'autenticazione se l'utente indossa ancora il dispositivo. Tieni presente che un sensore sul corpo sicuro determina se il dispositivo è indossato sul corpo dell'utente.

trustedUserPresenceRequired

Presente solo nella versione dell'attestazione della chiave >= 3.

Corrisponde al tag di Tag::TRUSTED_USER_PRESENCE_REQUIRED autorizzazione, che utilizza un valore ID tag pari a 507.

Specifica che questa chiave è utilizzabile solo se l'utente ha fornito una prova della presenza fisica. Ecco alcuni esempi:

  • Per una chiave StrongBox, un pulsante hardware collegato tramite cavo a un pin sul dispositivo StrongBox.
  • Per una chiave TEE, l'autenticazione tramite impronta fornisce la prova della presenza a condizione che il TEE abbia il controllo esclusivo dello scanner ed esegua la procedura di corrispondenza delle impronte.
trustedConfirmationRequired

Presente solo nella versione dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::TRUSTED_CONFIRMATION_REQUIRED, che utilizza un valore ID tag pari a 508.

Specifica che la chiave è utilizzabile solo se l'utente fornisce la conferma dei dati da firmare utilizzando un token di approvazione. Per ulteriori informazioni su come ottenere la conferma dell'utente, consulta Conferma protetta Android.

Nota: questo tag è applicabile solo alle chiavi che utilizzano scopo SIGN.

unlockedDeviceRequired

Presente solo nella versione dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::UNLOCKED_DEVICE_REQUIRED, che utilizza un valore ID tag pari a 509.

allApplications

Corrisponde al Tag::ALL_APPLICATIONS tag di autorizzazione, che utilizza un valore ID tag pari a 600.

Indica se tutte le app su un dispositivo possono accedere alla coppia di chiavi.

applicationId
Corrisponde al tag di autorizzazione Tag::APPLICATION_ID, che utilizza un valore ID tag pari a 601.
creationDateTime
Corrisponde al tag di autorizzazione Tag::CREATION_DATETIME, che utilizza un valore ID tag pari a 701.
origin

Corrisponde al tag di autorizzazione Tag::ORIGIN, che utilizza un valore ID tag pari a 702.

rollbackResistant

Presente solo nelle versioni 1 e 2 dell'attestazione chiave.

Corrisponde al tag di autorizzazione Tag::ROLLBACK_RESISTANT, che utilizza un valore ID tag pari a 703.

rootOfTrust

Corrisponde al tag di autorizzazione Tag::ROOT_OF_TRUST, che utilizza il valore ID tag 704.

Per ulteriori dettagli, consulta la sezione che descrive la struttura dei dati RootOfTrust.

osVersion

Corrisponde al Tag::OS_VERSION tag di autorizzazione, che utilizza un valore ID tag di 705.

La versione del sistema operativo Android associata al Keymaster, specificata come numero intero di sei cifre. Ad esempio, la versione 8.1.0 è rappresentata come 080100.

Solo Keymaster versione 1.0 o successive include questo valore nell'elenco di autorizzazione.

osPatchLevel

Corrisponde al Tag::PATCHLEVEL tag di autorizzazione, che utilizza un valore ID tag di 706.

Il mese e l'anno associati alla patch di sicurezza in uso all'interno di Keymaster, specificati come numero intero di sei cifre. Ad esempio, la patch di agosto 2018 è rappresentata come 201808.

Solo Keymaster versione 1.0 o successive include questo valore nell'elenco di autorizzazione.

attestationApplicationId

Presente solo nelle versioni di attestazione della chiave >= 2.

Corrisponde al Tag::ATTESTATION_APPLICATION_ID tag di autorizzazione Keymaster, che utilizza un valore ID tag pari a 709.

Per maggiori dettagli, consulta la sezione che descrive la struttura di dati AttestationApplicationId.

attestationIdBrand

Presente solo nelle versioni di attestazione della chiave >= 2.

Corrisponde al Tag::ATTESTATION_ID_BRAND tag Keymaster, che utilizza un valore ID tag di 710.

attestationIdDevice

Presente solo nelle versioni di attestazione della chiave >= 2.

Corrisponde al tag Keymaster Tag::ATTESTATION_ID_DEVICE, che utilizza un valore ID tag pari a 711.

attestationIdProduct

Presente solo nelle versioni di attestazione della chiave >= 2.

Corrisponde al tag Keymaster Tag::ATTESTATION_ID_PRODUCT, che utilizza un valore ID tag pari a 712.

attestationIdSerial

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al tag Keymaster Tag::ATTESTATION_ID_SERIAL, che utilizza un valore ID tag pari a 713.

attestationIdImei

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_IMEI, che utilizza un valore ID tag pari a 714.

attestationIdMeid

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_MEID, che utilizza un valore ID tag pari a 715.

attestationIdManufacturer

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_MANUFACTURER, che utilizza un valore ID tag pari a 716.

attestationIdModel

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_MODEL, che utilizza un valore ID tag di 717.

vendorPatchLevel

Presente solo nelle versioni di attestazione delle chiavi >= 3.

Corrisponde al tag di autorizzazione Tag::VENDOR_PATCHLEVEL, che utilizza un valore ID tag pari a 718.

Specifica il livello della patch di sicurezza dell'immagine del fornitore che deve essere installato sul dispositivo per l'utilizzo di questa chiave. Il valore viene visualizzato nel formato AAAAMMGG e rappresenta la data della patch di sicurezza del fornitore. Ad esempio, se una chiave è stata generata su un dispositivo Android con la patch di sicurezza del fornitore installata il 1° agosto 2018, questo valore sarà 20180801.

bootPatchLevel

Presente solo nelle versioni di attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::BOOT_PATCHLEVEL, che utilizza un valore ID tag pari a 719.

Specifica il livello patch di sicurezza dell'immagine del kernel che deve essere installato sul dispositivo per poter utilizzare questa chiave. Il valore viene visualizzato nel formato AAAAMMGG e rappresenta la data della patch di sicurezza di sistema. Ad esempio, se una chiave è stata generata su un dispositivo Android con la patch di sicurezza del sistema installata il 5 agosto 2018, questo valore sarà 20180805.

deviceUniqueAttestation

Presente solo nelle versioni di attestazione delle chiavi >= 4.

Corrisponde al tag di autorizzazione Tag::DEVICE_UNIQUE_ATTESTATION, che utilizza un valore ID tag pari a 720.

attestationIdSecondImei

Presente solo nelle versioni di attestazione delle chiavi >= 300.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_SECOND_IMEI, che utilizza un valore ID tag pari a 723.

RootOfTrust

Questa raccolta di valori definisce le informazioni chiave sullo stato del dispositivo.

Ogni campo nel seguente elenco è obbligatorio:

verifiedBootKey

Un hash sicuro della chiave che verifica l'immagine di sistema. Ti consigliamo di utilizzare l'algoritmo SHA-256 per questo hash.

deviceLocked
Vero se il bootloader del dispositivo è bloccato, il che abilita il controllo dell'Avvio verificato e impedisce il flashing di un'immagine del dispositivo non firmata sul dispositivo. Per ulteriori informazioni su questa funzionalità, consulta la documentazione su Verifying bootloader.
verifiedBootState
Lo stato di avvio del dispositivo, in base alla funzionalità Avvio verificato.
verifiedBootHash

Presente solo nelle versioni di attestazione della chiave >= 3.

Un digest di tutti i dati protetti da Avvio verificato. Per i dispositivi che utilizzano l'implementazione dell'Avvio verificato di Android, questo valore contiene il digest dello struct VBMeta o la struttura dei metadati dell'Avvio verificato.

Per scoprire di più su come calcolare questo valore, consulta Il riepilogo VBMeta.

VerifiedBootState

Questa struttura di dati fornisce lo stato di avvio corrente del dispositivo, che rappresenta il livello di protezione fornito all'utente e alle app al termine dell'avvio del dispositivo. Per saperne di più su questa funzionalità, consulta la sezione Stato di avvio nella documentazione relativa alla verifica dell'avvio.

Questa struttura di dati è un'enumerazione, quindi assume esattamente uno dei seguenti valori:

Verificato

Indica una catena di attendibilità completa, che include il bootloader, la partizione di boot e tutte le partizioni verificate.

Quando il dispositivo è in questo stato di avvio, verifiedBootKey è l'hash del certificato incorporato del dispositivo, che il produttore aggiunge alla ROM del dispositivo in fabbrica.

Autofirmato

Indica che il certificato incorporato nel dispositivo ha verificato la partizione di avvio del dispositivo e che la firma è valida.

Quando il dispositivo è in questo stato di avvio, verifiedBootKey è l'hash di un certificato installato dall'utente, che firma una partizione di avvio che l'utente aggiunge al dispositivo al posto della partizione di avvio originale, fornita dal produttore.

Non verificato
Indica che l'utente può modificare liberamente il dispositivo. Pertanto, l'utente è responsabile della verifica dell'integrità del dispositivo.
Operazione non riuscita
Indica che la verifica del dispositivo non è riuscita. Il certificato di attestazione non deve mai utilizzare questo valore per VerifiedBootState.

AttestationApplicationId

Questa struttura di dati riflette la convinzione della piattaforma Android in merito alle app che sono autorizzate a utilizzare il materiale della chiave segreta nell'ambito dell'attestazione. L'ID può includere più pacchetti se e solo se più pacchetti condividono lo stesso UID. La stringa di ottetto è formattata automaticamente in base al seguente schema ASN.1:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
info_pacchetto
Un insieme di oggetti AttestationPackageInfo, ognuno dei quali fornisce il nome e il numero di versione di un pacchetto.
signature_digests

Un insieme di digest SHA-256 dei certificati di firma dell'app. Un'app può avere più catene di certificati delle chiavi di firma. Per ogni certificato "a foglia", viene eseguito l'analisi e il certificato viene inserito nel campo signature_digests. Il nome del campo è fuorviante, poiché i dati digeriti sono i certificati di firma dell'app, non le firme dell'app, perché viene chiamato per la classe Signature restituita da una chiamata a getPackageInfo(). Il seguente snippet di codice mostra un insieme di esempio:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}

Schema dei dati dell'estensione delle informazioni di provisioning

L'estensione delle informazioni di provisioning ha l'OID 1.3.6.1.4.1.11129.2.1.30. L'estensione fornisce informazioni note sul dispositivo dal server di provisioning. Questa estensione segue uno schema CDDL.

  {
        1 : int,   ; certificates issued
  }

La mappa non è sottoposta a controllo della versione e possono essere aggiunti nuovi campi facoltativi.

certs_issued

Un numero approssimativo di certificati emessi per il dispositivo negli ultimi 30 giorni. Questo valore può essere utilizzato come indicatore di potenziali abusi se è superiore alla media di alcuni ordini di grandezza.