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:
-
Utilizza il metodo
getCertificateChain()
di un oggettoKeyStore
per ottenere un riferimento alla catena di certificati X.509 associati al keystore basato sull'hardware. -
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 è.
-
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.
-
Controlla lo stato di revoca di ciascun certificato per assicurarti che nessuno sia stato revocato.
-
(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.
-
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.
-
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:
- La tua chiave si trova in hardware che Google ritiene sicuro.
- 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.
Valore Versione 1 Keymaster versione 2.0 2 Keymaster versione 3.0 3 Versione Keymaster 4.0 4 Versione Keymaster 4.1 100 KeyMint versione 1.0 200 KeyMint versione 2.0 300 KeyMint 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.
Valore Versione 0 Keymaster versione 0.2 o 0.3 1 Keymaster versione 1.0 2 Keymaster versione 2.0 3 Keymaster versione 3.0 4 Versione Keymaster 4.0 41 Keymaster versione 4.1 100 KeyMint versione 1.0 200 KeyMint versione 2.0 300 KeyMint 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 è sempreRSA
oEC
. -
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 alTag::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 classeSignature
restituita da una chiamata agetPackageInfo()
. 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.