L'attestation de clé vous permet de vous assurer que les clés que vous utilisez dans votre application sont stockées dans le keystore intégré au matériel d'un appareil. Les sections suivantes décrivent comment valider les propriétés des clés intégrées au matériel et interpréter les données d'extension des certificats d'attestation.
Remarque : Avant de valider les propriétés des clés intégrées au matériel d'un appareil dans un environnement de production, assurez-vous que l'appareil prend en charge l'attestation de clé au niveau du matériel. Pour ce faire, vérifiez que la chaîne de certificats d'attestation contient un certificat racine signé avec la clé racine d'attestation Google et que l'élément attestationSecurityLevel
, qui figure dans la structure de données de description de la clé, est défini sur le niveau de sécurité TrustedEnvironment
.
En outre, il est important de vérifier les signatures de la chaîne de certificats et de vous assurer qu'aucune des clés de la chaîne n'a été révoquée en consultant la liste des états de révocation des certificats. Si toutes les attestations ne sont pas valides et que la racine n'est pas la clé racine Google, ne faites pas entièrement confiance à l'attestation. Notez toutefois que les appareils contenant des certificats révoqués restent au moins aussi fiables que les appareils qui ne prennent en charge que l'attestation logicielle. Une attestation entièrement valide constitue un indicateur positif. Si vous n'en avez pas, cela constitue un indicateur neutre, et non négatif.
Récupérer et valider une paire de clés intégrée au matériel
Lors de l'attestation de clé, vous spécifiez l'alias d'une paire de clés et récupérez sa chaîne de certificats, que vous pouvez utiliser pour valider les propriétés de cette paire.
Si l'appareil prend en charge l'attestation de clé au niveau du matériel, le certificat racine de cette chaîne est signé à l'aide d'une clé racine d'attestation provisionnée de manière sécurisée sur le keystore intégré au matériel de l'appareil.
Remarque : Sur les appareils équipés d'une attestation de clé au niveau du matériel, d'Android 7.0 (niveau d'API 24) ou version ultérieure et des services Google Play, le certificat racine est signé avec la clé racine d'attestation Google. Vérifiez que ce certificat racine figure parmi ceux énumérés dans la section sur les certificats racine.
Pour implémenter l'attestation de clé, procédez comme suit :
-
Utilisez la méthode
getCertificateChain()
d'un objetKeyStore
pour obtenir une référence à la chaîne de certificats X.509 associés au keystore intégré au matériel. -
Envoyez les certificats à un serveur distinct de confiance pour la validation.
Attention : N'effectuez pas le processus de validation suivant sur le même appareil que le keystore. Si le système Android de cet appareil est compromis, le processus de validation peut faire confiance à un élément non fiable.
-
Obtenez une référence à la bibliothèque d'analyse et de validation de la chaîne de certificats X.509 la plus adaptée à votre ensemble d'outils. Vérifiez que le certificat public racine est fiable et que chaque certificat signe le certificat suivant de la chaîne.
-
Vérifiez l'état de révocation de chaque certificat pour vous assurer qu'aucun des certificats n'a été révoqué.
-
Si vous le souhaitez, inspectez l'extension de certificat d'informations de provisionnement qui n'est présente que dans les chaînes de certificats les plus récentes.
Obtenez une référence à la bibliothèque d'analyseur CBOR la plus adaptée à votre ensemble d'outils. Recherchez le certificat le plus proche de la racine qui contient l'extension de certificat d'informations de provisionnement. Utilisez l'analyseur pour extraire de ce certificat les données de l'extension de certificat d'informations de provisionnement.
Pour en savoir plus, consultez la section sur le schéma de données des extensions d'informations de provisionnement.
-
Obtenez une référence à la bibliothèque d'analyseur ASN.1 la plus adaptée à votre ensemble d'outils. Recherchez le certificat le plus proche de la racine qui contient l'extension de certificat d'attestation de clé. Si l'extension de certificat d'informations de provisionnement était présente, l'extension de certificat d'attestation de clé doit figurer dans le certificat suivant. Utilisez l'analyseur pour extraire de ce certificat les données de l'extension de certificat d'attestation de clé.
Attention : Ne partez pas du principe que l'extension de certificat d'attestation de clé se trouve dans le certificat d'entité finale de la chaîne. Seule la première occurrence de l'extension de la chaîne peut être fiable. Toutes les autres instances de l'extension n'ont pas été émises par le matériel sécurisé. Elles pourraient avoir été émises par un pirate informatique qui étend la chaîne en tentant de créer de fausses attestations pour des clés qui ne sont pas fiables.
L'exemple d'attestation de clé utilise l'analyseur ASN.1 de Bouncy Castle pour extraire les données d'extension d'un certificat d'attestation. Vous pouvez utiliser cet exemple comme référence pour créer votre propre analyseur.
Pour en savoir plus, consultez la section sur le schéma de données de l'extension d'attestation de clé.
-
Vérifiez la cohérence des données d'extension que vous avez récupérées aux étapes précédentes et comparez-les à l'ensemble des valeurs que la clé intégrée au matériel devrait contenir.
Certificats racines
La fiabilité de l'attestation dépend du certificat racine de la chaîne. Les appareils Android ayant réussi les tests requis pour disposer de la suite d'applications Google, y compris Google Play, et lancés avec Android 7.0 (niveau d'API 24) ou version ultérieure doivent utiliser des clés d'attestation signées par le certificat racine d'attestation du matériel Google. Notez que l'attestation n'était pas requise avant Android 8.0 (niveau d'API 26). La clé publique racine est la suivante :
-----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-----
Certificats racine précédemment émis
-----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-----
Si le certificat racine de la chaîne d'attestation que vous recevez contient cette clé publique et qu'aucun des certificats de la chaîne n'a été révoqué, alors vous savez que :
- Votre clé se trouve dans du matériel qui, selon Google, est sécurisé.
- Il possède les propriétés décrites dans le certificat d'attestation.
Si la chaîne d'attestation comporte une autre clé publique racine, alors Google ne revendique pas la sécurité du matériel. Cela ne signifie pas que la sécurité de votre clé est compromise, mais que l'attestation ne prouve pas qu'elle se trouve dans du matériel sécurisé. Ajustez vos hypothèses de sécurité en conséquence.
Si le certificat racine ne contient pas la clé publique sur cette page, deux raisons sont probables :
- L'appareil a probablement été lancé avec une version d'Android antérieure à 7.0 et ne prend donc pas en charge l'attestation du matériel. Dans ce cas, Android dispose d'une implémentation logicielle d'attestation qui produit le même type de certificat d'attestation, mais qui est signée avec une clé codée en dur dans le code source Android. Comme cette clé de signature n'est pas secrète, il est possible que l'attestation ait été créée par un pirate informatique qui prétend fournir du matériel sécurisé.
- L'autre raison probable est que l'appareil n'est pas un appareil Google Play. Dans ce cas, le fabricant de l'appareil est libre de créer sa propre racine et de formuler les revendications qu'il souhaite sur la signification de l'attestation. Consultez la documentation du fabricant de l'appareil. Notez qu'au moment où nous écrivons ces lignes, Google n'a connaissance d'aucun fabricant d'appareils ayant utilisé cette méthode.
Liste des états de révocation des certificats
Les clés d'attestation peuvent être révoquées pour plusieurs raisons, par exemple en cas de mauvaise gestion ou de suspicion d'extraction par un pirate informatique. Par conséquent, il est essentiel que l'état de chaque certificat d'une chaîne d'attestation soit validé par rapport à la liste officielle des états de révocation des certificats (LRC).
Cette liste est gérée par Google et publiée à l'adresse suivante : https://android.googleapis.com/attestation/status. L'en-tête Cache-Control
de la réponse HTTP détermine la fréquence de recherche des mises à jour afin qu'une requête réseau ne soit pas requise pour chaque certificat en cours de validation.
Cette URL renvoie un fichier JSON contenant l'état de révocation des certificats dont l'état n'est pas valide. Le format du fichier JSON respecte la définition de schéma JSON suivante (brouillon 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 }
Exemple de LRC :
{ "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" } } }
Anciennes LRC
Les URL de LRC intégrées aux anciens certificats d'attestation continuent de fonctionner. Les nouveaux certificats d'attestation ne contiennent plus d'extension d'URL de LRC. L'état des anciens certificats est également inclus dans la liste des états des attestations. Les développeurs peuvent ainsi passer de manière sécurisée à la liste d'états des attestations pour les nouveaux et les anciens certificats. L'exemple d'attestation de clé contient un modèle illustrant comment valider correctement les clés d'attestation Android.
Schéma de données des extensions d'attestation de clé
L'extension d'attestation de clé porte l'OID 1.3.6.1.4.1.11129.2.1.17
. L'extension stocke les informations selon un schéma ASN.1. Pour afficher le schéma correspondant à la version d'attestation que vous utilisez, sélectionnez l'onglet approprié dans la liste des schémas suivante :
Version 200
KeyDescription ::= SEQUENCE { attestationVersion 200, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, teeEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Version 100
KeyDescription ::= SEQUENCE { attestationVersion 100, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, teeEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Version 4
KeyDescription ::= SEQUENCE { attestationVersion 4, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, teeEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, applicationId [601] EXPLICIT OCTET_STRING OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Version 3
KeyDescription ::= SEQUENCE { attestationVersion 3, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, teeEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, applicationId [601] EXPLICIT OCTET_STRING OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Version 2
KeyDescription ::= SEQUENCE { attestationVersion 2, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, teeEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, applicationId [601] EXPLICIT OCTET_STRING OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Version 1
KeyDescription ::= SEQUENCE { attestationVersion 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, teeEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, applicationId [601] EXPLICIT OCTET_STRING OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
La liste suivante présente une description de chaque élément du schéma :
KeyDescription
Cette séquence de valeurs présente des informations générales sur la paire de clés validée via une attestation de clé et permet d'accéder facilement à des détails supplémentaires.
-
attestationVersion
-
Version de la fonctionnalité d'attestation de clé.
Valeur Version 1 Keymaster version 2.0 2 Keymaster version 3.0 3 Keymaster version 4.0 4 Keymaster version 4.1 100 KeyMint version 1.0 200 KeyMint version 2.0 -
attestationSecurityLevel
-
Niveau de sécurité de l'attestation.
Avertissement : Bien qu'il soit possible d'attester des clés stockées dans le système Android, c'est-à-dire si la valeur de
attestationSecurityLevel
est définie sur Logiciel, vous ne pouvez pas vous fier à ces attestations si le système Android est compromis. -
keymasterVersion
/keyMintVersion
-
Version de la couche d'abstraction matérielle (HAL) Keymaster ou KeyMint.
Valeur Version 0 Keymaster version 0.2 ou 0.3 1 Keymaster version 1.0 2 Keymaster version 2.0 3 Keymaster version 3.0 4 Keymaster version 4.0 41 Keymaster version 4.1 100 KeyMint version 1.0 200 KeyMint version 2.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Niveau de sécurité de l'implémentation de Keymaster/KeyMint.
-
attestationChallenge
- contient le défi fourni au moment de la création de la clé. Vérifiez si cette valeur correspond à celle fournie par votre serveur, telle qu'elle est stockée dans la balise d'autorisation
Tag::ATTESTATION_CHALLENGE
. Sinon, votre service risque d'être vulnérable à la relecture d'anciens certificats d'attestation. -
uniqueId
-
Cette valeur identifie l'appareil, mais seulement pendant une période limitée. Elle est calculée et n'est utilisée que par les applications système. Dans toutes les autres applications,
uniqueId
est vide. -
softwareEnforced
- Facultatif. Liste d'autorisations Keymaster/KeyMint appliquée par le système Android, et non par l'environnement d'exécution sécurisé (TEE) de l'appareil.
-
teeEnforced
- Facultatif. Liste d'autorisations Keymaster/KeyMint appliquée par le TEE de l'appareil.
SecurityLevel
Cette structure de données indique dans quelle mesure une fonctionnalité logicielle, telle qu'une paire de clés, est protégée selon son emplacement dans l'appareil.
Comme la structure de données est une énumération, elle prend exactement en charge l'une des valeurs suivantes :
- Logiciel
- La logique de création et de gestion de la fonctionnalité est mise en œuvre dans le système Android. Pour les besoins de la création et du stockage des paires de clés, cet emplacement est moins sécurisé que le TEE, mais il l'est plus que l'espace de traitement de votre application.
- TrustedEnvironment
- La logique de création et de gestion de la fonctionnalité est mise en œuvre dans du matériel sécurisé, tel qu'un TEE. Pour les besoins de création et de stockage des paires de clés, cet emplacement est plus sécurisé, car le matériel sécurisé est très résistant aux menaces à distance.
- StrongBox
- La logique de création et de gestion de la fonctionnalité est mise en œuvre dans un module matériel de sécurité dédié. Pour les besoins de création et de stockage des paires de clés, cet emplacement est plus sécurisé, car il résiste très bien aux attaques à distance et aux attaques matérielles contre le module.
AuthorizationList
Cette structure de données contient les propriétés de la paire de clés, telles que définies dans la couche d'abstraction matérielle (HAL) Keymaster ou KeyMint. Vous comparez ces valeurs à l'état actuel de l'appareil ou à un ensemble de valeurs attendues pour vérifier qu'une paire de clés valide peut toujours être utilisée dans votre application.
Chaque nom de champ correspond à une balise d'autorisation Keymaster/KeyMint portant un nom similaire.
Par exemple, le champ keySize
d'une liste d'autorisations correspond à la balise d'autorisation Tag::KEY_SIZE
.
Chaque champ de la liste suivante est facultatif :
-
purpose
-
Correspond à la balise d'autorisation
Tag::PURPOSE
, qui utilise une valeur d'ID de balise de 1. -
algorithm
-
Correspond à la balise d'autorisation
Tag::ALGORITHM
, qui utilise une valeur d'ID de balise de 2.Dans un objet
AuthorizationList
d'attestation, la valeur de l'algorithme est toujoursRSA
ouEC
. -
keySize
-
Correspond à la balise d'autorisation
Tag::KEY_SIZE
, qui utilise une valeur d'ID de balise de 3. -
digest
-
Correspond à la balise d'autorisation
Tag::DIGEST
, qui utilise une valeur d'ID de balise de 5. -
padding
-
Correspond à la balise d'autorisation
Tag::PADDING
, qui utilise une valeur d'ID de balise de 6. -
ecCurve
-
Correspond à la balise d'autorisation
Tag::EC_CURVE
, qui utilise une valeur d'ID de balise de 10.Ensemble de paramètres utilisé pour générer une paire de clés à courbe elliptique (EC) qui utilise l'ECDSA pour la signature et la validation, dans le keystore du système Android.
-
rsaPublicExponent
- Correspond à la balise d'autorisation
Tag::RSA_PUBLIC_EXPONENT
, qui utilise une valeur d'ID de balise de 200. -
mgfDigest
-
Présent uniquement dans la version d'attestation de clé 100 ou supérieure.
Correspond à la balise d'autorisation KeyMintTag::RSA_OAEP_MGF_DIGEST
, qui utilise une valeur d'ID de balise de 203. -
rollbackResistance
-
Présent uniquement dans la version d'attestation de clé 3 ou supérieure.
Correspond à la balise d'autorisation
Tag::ROLLBACK_RESISTANT
, qui utilise une valeur d'ID de balise de 303. -
earlyBootOnly
-
Présent uniquement dans la version d'attestation de clé 4 ou supérieure.
Correspond à la balise d'autorisation
Tag::EARLY_BOOT_ONLY
, qui utilise une valeur d'ID de balise de 305. -
activeDateTime
- Correspond à la balise d'autorisation
Tag::ACTIVE_DATETIME
, qui utilise une valeur d'ID de balise de 400. -
originationExpireDateTime
- Correspond à la balise d'autorisation Keymaster
Tag::ORIGINATION_EXPIRE_DATETIME
, qui utilise une valeur d'ID de balise de 401. -
usageExpireDateTime
- Correspond à la balise d'autorisation
Tag::USAGE_EXPIRE_DATETIME
, qui utilise une valeur d'ID de balise de 402. -
usageCountLimit
- Correspond à la balise d'autorisation
Tag::USAGE_COUNT_LIMIT
, qui utilise une valeur d'ID de balise de 405. -
noAuthRequired
-
Correspond à la balise d'autorisation
Tag::NO_AUTH_REQUIRED
, qui utilise une valeur d'ID de balise de 503. -
userAuthType
- Correspond à la balise d'autorisation
Tag::USER_AUTH_TYPE
, qui utilise une valeur d'ID de balise de 504. -
authTimeout
- Correspond à la balise d'autorisation
Tag::AUTH_TIMEOUT
, qui utilise une valeur d'ID de balise de 505 -
allowWhileOnBody
-
Correspond à la balise d'autorisation
Tag::ALLOW_WHILE_ON_BODY
, qui utilise une valeur d'ID de balise de 506.Permet d'utiliser la clé après le délai d'expiration de l'authentification si l'utilisateur porte encore l'appareil sur le corps. Notez qu'un capteur sécurisé sur le corps détermine si son utilisateur porte l'appareil sur lui.
-
trustedUserPresenceRequired
-
Présent uniquement dans la version d'attestation de clé 3 ou supérieure.
Correspond à la balise d'autorisation
Tag::TRUSTED_USER_PRESENCE_REQUIRED
, qui utilise une valeur d'ID de balise de 507.Indique que cette clé n'est utilisable que si l'utilisateur a fourni la preuve qu'il est présent physiquement. Quelques exemples :
- Pour une clé StrongBox, un bouton physique câblé sur une broche de l'appareil StrongBox.
- Pour une clé TEE, l'authentification par empreinte digitale fournit une preuve de présence, à condition que le TEE contrôle totalement le scanner et effectue le processus de mise en correspondance des empreintes digitales.
-
trustedConfirmationRequired
-
Présent uniquement dans la version d'attestation de clé 3 ou supérieure.
Correspond à la balise d'autorisation
Tag::TRUSTED_CONFIRMATION_REQUIRED
, qui utilise une valeur d'ID de balise de 508.Indique que la clé n'est utilisable que si l'utilisateur confirme les données à signer à l'aide d'un jeton d'approbation. Pour savoir comment obtenir la confirmation de l'utilisateur, consultez la Confirmation de protection Android.
Remarque : Cette balise ne s'applique qu'aux clés qui utilisent la fonction
SIGN
. -
unlockedDeviceRequired
-
Présent uniquement dans la version d'attestation de clé 3 ou supérieure.
Correspond à la balise d'autorisation
Tag::UNLOCKED_DEVICE_REQUIRED
, qui utilise une valeur d'ID de balise de 509. -
allApplications
-
Correspond à la balise d'autorisation
Tag::ALL_APPLICATIONS
, qui utilise une valeur d'ID de balise de 600.Indique si toutes les applications d'un appareil peuvent accéder à la paire de clés.
-
applicationId
- Correspond à la balise d'autorisation
Tag::APPLICATION_ID
, qui utilise une valeur d'ID de balise de 601. -
creationDateTime
- Correspond à la balise d'autorisation
Tag::CREATION_DATETIME
, qui utilise une valeur d'ID de balise de 701. -
origin
-
Correspond à la balise d'autorisation
Tag::ORIGIN
, qui utilise une valeur d'ID de balise de 702. -
rollbackResistant
-
Présent uniquement dans les versions d'attestation de clé 1 ou 2.
Correspond à la balise d'autorisation
Tag::ROLLBACK_RESISTANT
, qui utilise une valeur d'ID de balise de 703. -
rootOfTrust
-
Correspond à la balise d'autorisation
Tag::ROOT_OF_TRUST
, qui utilise une valeur d'ID de balise de 704.Pour en savoir plus, consultez la section qui décrit la structure de données RootOfTrust.
-
osVersion
-
Correspond à la balise d'autorisation
Tag::OS_VERSION
, qui utilise une valeur d'ID de balise de 705.Version du système d'exploitation Android associé au Keymaster, spécifiée sous la forme d'un entier à six chiffres. Par exemple, la version 8.1.0 est représentée par 080100.
Seule la version 1.0 ou ultérieure de Keymaster inclut cette valeur dans la liste d'autorisations.
-
osPatchLevel
-
Correspond à la balise d'autorisation
Tag::PATCHLEVEL
, qui utilise une valeur d'ID de balise de 706.Mois et année associés au correctif de sécurité utilisé dans le Keymaster, spécifiés sous la forme d'un entier à six chiffres. Par exemple, le correctif d'août 2018 est représenté par 201808.
Seule la version 1.0 ou ultérieure de Keymaster inclut cette valeur dans la liste d'autorisations.
-
attestationApplicationId
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise d'autorisation Keymaster
Tag::ATTESTATION_APPLICATION_ID
, qui utilise une valeur d'ID de balise de 709.Pour en savoir plus, consultez la section qui décrit la structure de données AttestationApplicationId.
-
attestationIdBrand
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise Keymaster
Tag::ATTESTATION_ID_BRAND
, qui utilise une valeur d'ID de balise de 710. -
attestationIdDevice
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise Keymaster
Tag::ATTESTATION_ID_DEVICE
, qui utilise une valeur d'ID de balise de 711. -
attestationIdProduct
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise Keymaster
Tag::ATTESTATION_ID_PRODUCT
, qui utilise une valeur d'ID de balise de 712. -
attestationIdSerial
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise Keymaster
Tag::ATTESTATION_ID_SERIAL
, qui utilise une valeur d'ID de balise de 713. -
attestationIdImei
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise d'autorisation
Tag::ATTESTATION_ID_IMEI
, qui utilise une valeur d'ID de balise de 714. -
attestationIdMeid
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise d'autorisation
Tag::ATTESTATION_ID_MEID
, qui utilise une valeur d'ID de balise de 715. -
attestationIdManufacturer
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise d'autorisation
Tag::ATTESTATION_ID_MANUFACTURER
, qui utilise une valeur d'ID de balise de 716. -
attestationIdModel
-
Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.
Correspond à la balise d'autorisation
Tag::ATTESTATION_ID_MODEL
, qui utilise une valeur d'ID de balise de 717. -
vendorPatchLevel
-
Présent uniquement dans les versions d'attestation de clé 3 ou supérieures.
Correspond à la balise d'autorisation
Tag::VENDOR_PATCHLEVEL
, qui utilise une valeur d'ID de balise de 718.Spécifie le niveau du correctif de sécurité de l'image du fournisseur à installer sur l'appareil pour que cette clé puisse être utilisée. La valeur apparaît au format AAAAMMJJ et représente la date du correctif de sécurité du fournisseur. Par exemple, si une clé a été générée sur un appareil Android sur lequel le correctif de sécurité du fournisseur est installé le 1er août 2018, cette valeur est 20180801.
-
bootPatchLevel
-
Présent uniquement dans les versions d'attestation de clé 3 ou supérieures.
Correspond à la balise d'autorisation
Tag::BOOT_PATCHLEVEL
, qui utilise une valeur d'ID de balise de 719.Spécifie le niveau du correctif de sécurité de l'image du noyau à installer sur l'appareil pour que cette clé puisse être utilisée. La valeur apparaît au format AAAAMMJJ et représente la date du correctif de sécurité du système. Par exemple, si une clé a été générée sur un appareil Android sur lequel le correctif de sécurité du système est installé le 5 août 2018, cette valeur est 20180805.
-
deviceUniqueAttestation
-
Présent uniquement dans les versions d'attestation de clé 4 ou supérieures.
Correspond à la balise d'autorisation
Tag::DEVICE_UNIQUE_ATTESTATION
, qui utilise une valeur d'ID de balise de 720.
RootOfTrust
Cet ensemble de valeurs définit les informations clés sur l'état de l'appareil.
Chaque champ de la liste suivante est obligatoire :
-
verifiedBootKey
-
Un hachage sécurisé de la clé qui valide l'image système. Il est recommandé d'utiliser l'algorithme SHA-256 pour ce hachage.
-
deviceLocked
- Vrai si le bootloader de l'appareil est verrouillé, ce qui active la vérification du démarrage validé et empêche le flash d'une image d'appareil non signée sur l'appareil. Pour en savoir plus sur cette fonctionnalité, consultez la documentation Valider le démarrage.
-
verifiedBootState
- État de démarrage de l'appareil, selon la fonctionnalité de démarrage validé.
-
verifiedBootHash
-
Présent uniquement dans la version d'attestation de clé 3.
Condensé de toutes les données protégées par le démarrage validé. Pour les appareils qui utilisent la mise en œuvre du démarrage validé Android, cette valeur contient le condensé de la structure VBMeta, ou structure de métadonnées du démarrage validé.
Pour en savoir plus sur le calcul de cette valeur, consultez le condensé des VBMeta.
VerifiedBootState
Cette structure de données fournit l'état de démarrage actuel de l'appareil, qui représente le niveau de protection accordé à l'utilisateur et aux applications une fois le démarrage terminé. Pour en savoir plus sur cette fonctionnalité, consultez la section État de démarrage dans la documentation Valider le démarrage.
Cette structure de données est une énumération. Elle prend donc exactement en charge l'une des valeurs suivantes :
- Validé
-
Indique une chaîne de confiance complète, y compris le bootloader, la partition de démarrage et toutes les partitions validées.
Lorsque l'appareil est dans cet état de démarrage,
verifiedBootKey
correspond au hachage du certificat intégré à l'appareil, que le fabricant de l'appareil ajoute à la mémoire ROM de l'appareil en usine. - SelfSigned
-
Indique que le certificat intégré à l'appareil a validé la partition de démarrage de l'appareil et que la signature est valide.
Lorsque l'appareil est dans cet état de démarrage,
verifiedBootKey
est le hachage d'un certificat installé par l'utilisateur, qui signe une partition de démarrage que l'utilisateur ajoute à l'appareil à la place de la partition de démarrage d'origine fournie par le fabricant. - Non validé
- Indique que l'utilisateur peut modifier l'appareil librement. Il appartient donc à l'utilisateur de vérifier l'intégrité de l'appareil.
- Échec
-
Indique que la validation de l'appareil a échoué. Le certificat d'attestation ne doit jamais utiliser cette valeur pour
VerifiedBootState
.
AttestationApplicationId
Cette structure de données reflète la conviction de la plate-forme Android quant aux applications autorisées à utiliser le matériel de clé secrète délivré par l'attestation. L'ID peut comprendre plusieurs packages si et seulement si plusieurs packages partagent le même UID. La chaîne d'octets est elle-même formatée selon le schéma ASN.1 suivant :
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
- package_infos
- Un ensemble d'objets
AttestationPackageInfo
, chacun fournissant le nom et le numéro de version d'un package. - signature_digests
-
Ensemble de condensés SHA-256 des certificats de signature de l'application. Une application peut avoir plusieurs chaînes de certificats de clés de signature. Pour chacun, le certificat d'entité finale est condensé et placé dans le champ
signature_digests
. Le nom du champ est trompeur, puisque les données condensées sont les certificats de signature de l'application, et non les signatures d'application, car ils sont nommés d'après la classeSignature
renvoyée par un appel àgetPackageInfo()
. L'extrait de code suivant présente un exemple d'ensemble :{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Schéma de données des extensions d'informations de provisionnement
L'extension d'informations de provisionnement porte l'OID 1.3.6.1.4.1.11129.2.1.30
. L'extension fournit des informations connues sur l'appareil par le serveur de provisionnement. Cette extension suit un schéma CDDL.
{ 1 : int, ; certificates issued }
La carte n'a pas de version, et de nouveaux champs facultatifs peuvent être ajoutés.
-
certs_issued
-
Nombre approximatif de certificats émis pour l'appareil au cours des 30 derniers jours. Cette valeur peut être utilisée comme signal d'utilisation abusive potentielle si elle est supérieure à la moyenne de certains ordres de grandeur.