La certificación de claves te brinda la confianza de que las claves que usas en tu app se conservan en el almacén de claves en el hardware del dispositivo. En las siguientes secciones, se describe cómo verificar las propiedades de las claves guardadas en hardware e interpretar los datos de extensión de las certificaciones.
Nota: Antes de verificar las propiedades de las claves guardadas en hardware de un dispositivo en un entorno de producción, debes asegurarte de que el dispositivo admita certificación de claves a nivel del hardware. Para ello, debes comprobar que la cadena de certificación contenga un certificado raíz firmado por la clave raíz de certificación de Google y que el elemento attestationSecurityLevel
dentro de la estructura de datos de la descripción de la clave se configure a nivel de seguridad de TrustedEnvironment
.
Además, es importante verificar las firmas en la cadena de certificados y comprobar que ninguna de las claves de esta se haya revocado. Para ello, debes revisar la Lista de estado de revocación de certificados. A menos que todas sean válidas y que la raíz sea la clave raíz de Google, no confíes completamente en la certificación. Sin embargo, ten en cuenta que los dispositivos que contienen certificados revocados son igual de confiables que los dispositivos que solo admiten la certificación de software. Tener una certificación válida es un indicador muy positivo. No tener una es un indicador neutral, no negativo.
Recuperación y verificación de un par de claves guardado en hardware
Durante la certificación de claves, se especifica el alias de un par de claves y se recupera su cadena de certificados, que puedes usar para verificar las propiedades de ese par de claves.
Si el dispositivo admite certificación de claves a nivel del hardware, el certificado raíz de esta cadena se firma con una clave raíz de certificación que se aprovisiona de forma segura en el almacén de claves de la copia de seguridad en el hardware del dispositivo.
Nota: En dispositivos que cuentan con certificación de claves guardadas en hardware, Android 7.0 (nivel de API 24) o versiones posteriores y Servicios de Google Play, el certificado raíz se firma con la clave raíz de certificación de Google. Verifica que este certificado raíz esté entre los que aparecen en la sección sobre certificados raíz.
Para implementar la certificación de claves, haz lo siguiente:
- Usa el método
getCertificateChain()
de un objetoKeyStore
para obtener una referencia a la cadena de certificados X.509 asociada con el almacén de claves guardadas en hardware. -
Envía los certificados a otro servidor de confianza para la validación.
Precaución: No completes el siguiente proceso de validación en el mismo dispositivo que el almacén de claves. Si el sistema Android de ese dispositivo está comprometido, es posible que el proceso de validación confíe en algo que no es confiable.
-
Obtén la referencia a la biblioteca de validación y análisis de la cadena de certificados X.509 que sea más adecuada para tu conjunto de herramientas. Verifica que el certificado público raíz sea confiable y que cada certificado firme el siguiente de la cadena.
-
Comprueba el estado de revocación de cada certificado para asegurarte de que no se haya revocado ninguno.
-
De manera opcional, inspecciona la extensión del certificado de información de aprovisionamiento que solo está presente en las cadenas de certificados más nuevas.
Obtén la referencia a la biblioteca de analizadores CBOR que sea más adecuada para tu conjunto de herramientas. Encuentra el certificado más cercano a la raíz que contiene la extensión del certificado de información de aprovisionamiento. Usa el analizador para extraer los datos de extensión del certificado de información de aprovisionamiento de ese certificado.
Consulta la sección sobre el esquema de datos de la extensión de información de aprovisionamiento para obtener más detalles.
-
Obtén la referencia a la biblioteca de analizadores de ASN.1 que sea más adecuada para tu conjunto de herramientas. Encuentra el certificado más cercano a la raíz que contiene la extensión del certificado de certificación de claves. Si la extensión del certificado de información de aprovisionamiento estaba presente, la extensión del certificado de certificación de claves debe estar en el certificado inmediatamente posterior. Usa el analizador para extraer los datos de extensión del certificado de certificación de claves de ese certificado.
Precaución: No des por sentado que la extensión del certificado de certificación de claves se encuentra en el certificado de entidad final de la cadena. Solo se puede confiar en la primera instancia de extensión de la cadena. El hardware seguro no emitió otras instancias de la extensión, y es posible que las haya emitido un atacante que extendió la cadena mientras intentaba crear certificaciones falsas para claves que no son de confianza.
En el ejemplo de certificación de claves, se usa el analizador ASN.1 de Bouncy Castle para extraer los datos de extensión de la certificación. Puedes usar este ejemplo como referencia para crear tu propio analizador.
Consulta la sección sobre el esquema de datos de extensión de certificación de claves para obtener más información.
-
Verifica la coherencia de los datos de extensión que recuperaste en los pasos anteriores y compáralos con el conjunto de valores que esperas que contenga la clave guardada en hardware.
Certificados raíz
El nivel de confianza de la certificación depende del certificado raíz de la cadena. Los dispositivos Android que hayan pasado la prueba necesaria para tener el conjunto de apps de Google, incluido Google Play, y que se hayan lanzado con Android 7.0 (nivel de API 24) o versiones posteriores deberían usar las claves firmadas por el certificado raíz de certificación de Google. Ten en cuenta que no se requirió la certificación hasta Android 8.0 (nivel de API 26). La clave pública raíz es la siguiente:
-----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-----
Certificados raíz emitidos anteriormente
-----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 el certificado raíz en la cadena de certificación que recibes contiene esta clave pública y no se revocó ninguno de los certificados de la cadena, significa lo siguiente:
- Tu clave se encuentra en un hardware que Google considera seguro.
- Tiene las propiedades que se describen en la certificación.
Si la cadena de certificación tiene otro certificado raíz, Google no realiza reclamaciones de seguridad sobre el hardware. Esto no significa que la clave esté comprometida; solo que la certificación no prueba que la clave esté en hardware seguro. Ajusta tus suposiciones de seguridad según corresponda.
Si el certificado raíz no contiene la clave pública que aparece en esta página, es posible que se deba a uno de los siguientes motivos:
- Lo más probable es que el dispositivo se haya lanzado con una versión de Android anterior a la 7.0 y que no admita la certificación de hardware. En este caso, Android tiene una implementación de software de certificación que produce el mismo tipo de certificado, pero que se firma con una clave codificada a través del código fuente de Android. Como esta clave de firma no es secreta, es posible que un atacante haya creado la certificación fingiendo proporcionar un hardware seguro.
- El otro motivo probable es que el dispositivo no sea de Google Play. En ese caso, el fabricante del dispositivo puede crear su propia raíz y hacer las reclamaciones que desee sobre el significado de la certificación. Consulta la documentación del fabricante del dispositivo. Ten en cuenta que, hasta el momento de la publicación de este documento, Google no conoce fabricantes que hayan hecho esto.
Lista de estado de revocación de certificados
Las claves de certificación pueden revocarse por varios motivos, entre los que se incluyen el mal manejo o la posible extracción por parte de un atacante. Por lo tanto, es fundamental que se verifique el estado de cada certificado de una cadena de certificación con la lista de estado de revocación de certificados (CRL) oficial.
Google mantiene esta lista, que se publica en https://android.googleapis.com/attestation/status. El encabezado Cache-Control
en la respuesta HTTP determina la frecuencia con la que hay que comprobar si hay actualizaciones, de modo que no se requiere una solicitud de red para cada certificado que se verifica.
Esta URL muestra un archivo JSON que contiene el estado de revocación de los certificados que no tienen un estado normal válido. El formato del archivo JSON cumple con la siguiente definición del esquema de JSON (borrador 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 }
Ejemplo de 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" } } }
CRL heredadas
Las URLs de CRL incorporadas en certificaciones heredadas seguirán operando. Las nuevas certificaciones ya no incluirán una extensión de URL de CRL. También se incluirá el estado de los certificados heredados en la lista de estados de certificaciones, de modo que los desarrolladores puedan empezar a usar de manera segura la lista de estados de certificaciones tanto para los certificados nuevos como para los heredados. El ejemplo de certificación de claves muestra cómo verificar correctamente las claves de certificación de Android.
Esquema de los datos de extensión de la certificación de claves
La extensión de certificación de claves tiene OID 1.3.6.1.4.1.11129.2.1.17
. El certificado almacena información según un esquema de ASN.1. Para ver el esquema correspondiente a la versión de certificación que usas, selecciona la pestaña adecuada en el siguiente listado de esquemas:
Versión 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), }
Versión 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), }
Versión 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), }
Versión 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), }
Versión 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), }
Versión 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), }
En la lista siguiente se proporciona una descripción de cada elemento del esquema:
KeyDescription
Esta secuencia de valores ofrece información general sobre el par de claves que se verifica a través de la certificación de claves, y proporciona acceso sencillo a detalles adicionales.
-
attestationVersion
-
Versión de la función de certificación de claves.
Valor Versión 1 Keymaster versión 2.0 2 Keymaster versión 3.0 3 Keymaster versión 4.0 4 Keymaster versión 4.1 100 KeyMint versión 1.0 200 KeyMint versión 2.0 -
attestationSecurityLevel
-
Nivel de seguridad de la certificación.
Advertencia: Si bien es posible certificar claves almacenadas en el sistema Android (es decir, si el valor de
attestationSecurityLevel
se configura en Software), no puedes confiar en esas certificaciones si el sistema Android se ve comprometido. -
keymasterVersion
/keyMintVersion
-
Versión de la capa de abstracción de hardware (HAL) de Keymaster o KeyMint.
Valor Versión 0 Keymaster versión 0.2 o 0.3 1 Keymaster versión 1.0 2 Keymaster versión 2.0 3 Keymaster versión 3.0 4 Keymaster versión 4.0 41 Keymaster versión 4.1 100 KeyMint versión 1.0 200 KeyMint versión 2.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Es el nivel de seguridad de la implementación de Keymaster/KeyMint.
-
attestationChallenge
-
Contiene el desafío que se proporcionó en el momento de la creación de la clave. Verifica si este valor coincide con el que proporcionó tu servidor, como se almacena en la etiqueta de autorización
Tag::ATTESTATION_CHALLENGE
. De lo contrario, tu servicio podría ser vulnerable a la repetición de certificados antiguos. -
uniqueId
-
Este valor identifica el dispositivo, pero solo por un período de tiempo limitado. Solo las apps del sistema lo computan y lo utilizan. En las demás apps,
uniqueId
está vacío. -
softwareEnforced
- Opcional. Es la lista de autorización de Keymaster/KeyMint que aplica el sistema Android, no el entorno de ejecución confiable (TEE) del dispositivo.
-
teeEnforced
- Opcional. Es la lista de autorización de Keymaster/KeyMint que aplica el TEE del dispositivo.
SecurityLevel
Esta estructura de datos indica el nivel de protección de una función de software, como un par de claves, en función de su ubicación en el dispositivo.
Dado que la estructura de datos es una enumeración, adquiere exactamente uno de los siguientes valores:
- Software
- La lógica para crear y controlar la función se implementa en el sistema Android. Para la creación y el almacenamiento de pares de claves, esta ubicación es menos segura que el TEE, pero es más segura que el espacio de procesos de tu app.
- TrustedEnvironment
- La lógica para crear y controlar la función se implementa en hardware seguro, como un TEE. Para la creación y el almacenamiento de pares de claves, esta ubicación es más segura porque el hardware seguro es muy resistente a los peligros remotos.
- StrongBox
- La lógica para crear y administrar una función se implementa en un módulo de seguridad de hardware dedicado. Para la creación y el almacenamiento de pares de claves, esta ubicación es más segura porque el hardware seguro es muy resistente a los peligros remotos y los ataques de hardware contra el módulo.
AuthorizationList
Esta estructura de datos contiene las propiedades del par de claves, como se define en la capa de abstracción de hardware (HAL) de Keymaster o KeyMint. Debes comparar estos valores con el estado actual del dispositivo o con un conjunto de valores previstos para verificar que un par de claves siga siendo válido para usarse en tu app.
Cada nombre de campo corresponde a una etiqueta de Keymaster/KeyMint con una denominación similar.
Por ejemplo, el campo keySize
en una lista de autorizaciones corresponde a la etiqueta de autorización Tag::KEY_SIZE
.
Cada uno de los campos de la siguiente lista es opcional:
-
purpose
-
Corresponde a la etiqueta de autorización
Tag::PURPOSE
que usa un valor de ID de etiqueta de 1. -
algorithm
-
Corresponde a la etiqueta de autorización
Tag::ALGORITHM
que usa un valor de ID de etiqueta de 2.En un objeto
AuthorizationList
de certificación. El valor del algoritmo es siempreRSA
oEC
. -
keySize
-
Corresponde a la etiqueta de autorización
Tag::KEY_SIZE
que usa un valor de ID de etiqueta de 3. -
digest
-
Corresponde a la etiqueta de autorización
Tag::DIGEST
que usa un valor de ID de etiqueta de 5. -
padding
-
Corresponde a la etiqueta de autorización
Tag::PADDING
que usa un valor de ID de etiqueta de 6. -
ecCurve
-
Corresponde a la etiqueta de autorización
Tag::EC_CURVE
que usa un valor de ID de etiqueta de 10.Es el conjunto de parámetros empleados para generar un par de claves de curva elíptica (CE), que usa ECDSA para la firma y verificación, en el almacén de claves del sistema Android.
-
rsaPublicExponent
-
Corresponde a la etiqueta de autorización
Tag::RSA_PUBLIC_EXPONENT
de Keymaster que usa un valor de ID de etiqueta de 200. -
mgfDigest
-
Solo está presente en la versión de certificación de claves >= 100.
Corresponde a la etiqueta de autorizaciónTag::RSA_OAEP_MGF_DIGEST
de KeyMint que usa un valor de ID de etiqueta de 203. -
rollbackResistance
-
Solo está presente en la versión de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::ROLLBACK_RESISTANT
que usa un valor de ID de etiqueta de 303. -
earlyBootOnly
-
Solo está presente en la versión de certificación de claves >= 4.
Corresponde a la etiqueta de autorización
Tag::EARLY_BOOT_ONLY
que usa un valor de ID de etiqueta de 305. -
activeDateTime
-
Corresponde a la etiqueta de autorización
Tag::ACTIVE_DATETIME
que usa un valor de ID de etiqueta de 400. -
originationExpireDateTime
-
Corresponde a la etiqueta de autorización
Tag::ORIGINATION_EXPIRE_DATETIME
de Keymaster que usa un valor de ID de etiqueta de 401. -
usageExpireDateTime
-
Corresponde a la etiqueta de autorización
Tag::USAGE_EXPIRE_DATETIME
que usa un valor de ID de etiqueta de 402. -
usageCountLimit
-
Corresponde a la etiqueta de autorización
Tag::USAGE_COUNT_LIMIT
que usa un valor de ID de etiqueta de 405. -
noAuthRequired
-
Corresponde a la etiqueta de autorización
Tag::NO_AUTH_REQUIRED
de Keymaster que usa un valor de ID de etiqueta de 503. -
userAuthType
-
Corresponde a la etiqueta de autorización
Tag::USER_AUTH_TYPE
que usa un valor de ID de etiqueta de 504. -
authTimeout
-
Corresponde a la etiqueta de autorización
Tag::AUTH_TIMEOUT
que usa un valor de ID de etiqueta de 505. -
allowWhileOnBody
-
Corresponde a la etiqueta de autorización
Tag::ALLOW_WHILE_ON_BODY
que usa un valor de ID de etiqueta de 506.Permite usar la clave después de su período de espera para la autenticación si el usuario todavía lleva el dispositivo consigo. Recuerda que un sensor corporal seguro determina si el dispositivo está en contacto con el cuerpo del usuario.
-
trustedUserPresenceRequired
-
Solo está presente en la versión de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::TRUSTED_USER_PRESENCE_REQUIRED
que usa un valor de ID de etiqueta de 507.Especifica que esta clave solo se puede usar si el usuario proporcionó una prueba de presencia física. Entre los ejemplos, se incluyen los siguientes:
- Para una clave StrongBox, es un botón de hardware conectado con un pin en el dispositivo StrongBox.
- Para una clave de TEE, la autenticación de huella digital proporciona una prueba de presencia siempre y cuando el TEE tenga control exclusivo del escáner y realice el proceso de coincidencia de huella digital.
-
trustedConfirmationRequired
-
Solo está presente en la versión de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::TRUSTED_CONFIRMATION_REQUIRED
que usa un valor de ID de etiqueta de 508.Especifica que la clave solo se puede usar si el usuario proporciona confirmación de que los datos se firmarán con un token de aprobación. Para obtener más información acerca de cómo obtener confirmación del usuario, consulta Confirmación de protección de Android.
Nota: Esta etiqueta solo se aplica a claves que usan el propósito
SIGN
. -
unlockedDeviceRequired
-
Solo está presente en la versión de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::UNLOCKED_DEVICE_REQUIRED
que usa un valor de ID de etiqueta de 509. -
allApplications
-
Corresponde a la etiqueta de autorización
Tag::ALL_APPLICATIONS
que usa un valor de ID de etiqueta de 600.Indica si todas las apps de un dispositivo pueden acceder al par de claves.
-
applicationId
-
Corresponde a la etiqueta de autorización
Tag::APPLICATION_ID
que usa un valor de ID de etiqueta de 601. -
creationDateTime
-
Corresponde a la etiqueta de autorización
Tag::CREATION_DATETIME
que usa un valor de ID de etiqueta de 701. -
origin
-
Corresponde a la etiqueta de autorización
Tag::ORIGIN
que usa un valor de ID de etiqueta de 702. -
rollbackResistant
-
Solo está presente en las versiones de certificación 1 y 2.
Corresponde a la etiqueta de autorización
Tag::ROLLBACK_RESISTANT
que usa un valor de ID de etiqueta de 703. -
rootOfTrust
-
Corresponde a la etiqueta de autorización
Tag::ROOT_OF_TRUST
que usa un valor de ID de etiqueta de 704.Para obtener más información, consulta la sección en la que se describe la estructura de datos de RootOfTrust.
-
osVersion
-
Corresponde a la etiqueta de autorización
Tag::OS_VERSION
que usa un valor de ID de etiqueta de 705.Es la versión del sistema operativo Android asociada con Keymaster, especificada como un número entero de seis dígitos. Por ejemplo, la versión 8.1.0 se representa como 080100.
Solo en la versión 1.0 o las versiones posteriores de Keymaster se incluye este valor en la lista de autorizaciones.
-
osPatchLevel
-
Corresponde a la etiqueta de autorización
Tag::PATCHLEVEL
que usa un valor de ID de etiqueta de 706.El mes y el año asociados con el parche de seguridad que se usa en Keymaster, especificados como un número entero de seis dígitos. Por ejemplo, el parche de agosto de 2018 se representa como 201808.
Solo en la versión 1.0 o las versiones posteriores de Keymaster se incluye este valor en la lista de autorizaciones.
-
attestationApplicationId
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_APPLICATION_ID
de Keymaster que usa un valor de ID de etiqueta de 709.Para obtener más información, consulta la sección en la que se describe la estructura de datos de AttestationApplicationId.
-
attestationIdBrand
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta
Tag::ATTESTATION_ID_BRAND
de Keymaster que usa un valor de ID de etiqueta de 710. -
attestationIdDevice
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta
Tag::ATTESTATION_ID_DEVICE
de Keymaster que usa un valor de ID de etiqueta de 711. -
attestationIdProduct
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta
Tag::ATTESTATION_ID_PRODUCT
de Keymaster que usa un valor de ID de etiqueta de 712. -
attestationIdSerial
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta
Tag::ATTESTATION_ID_SERIAL
de Keymaster, que usa un valor de ID de etiqueta de 713. -
attestationIdImei
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_IMEI
que usa un valor de ID de etiqueta de 714. -
attestationIdMeid
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_MEID
que usa un valor de ID de etiqueta de 715. -
attestationIdManufacturer
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_MANUFACTURER
que usa un valor de ID de etiqueta de 716. -
attestationIdModel
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_MODEL
que usa un valor de ID de etiqueta de 717. -
vendorPatchLevel
-
Solo está presente en versiones de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::VENDOR_PATCHLEVEL
que usa un valor de ID de etiqueta de 718.Especifica el nivel de parche de seguridad de la imagen del proveedor que debe instalarse en el dispositivo para que se use esta clave. El valor aparece en el formato AAAAMMDD, que representa la fecha del parche de seguridad del proveedor. Por ejemplo, si una clave se hubiera generado en un dispositivo Android con el parche de seguridad del 1 de agosto de 2018 del proveedor instalado, este valor sería 20180801.
-
bootPatchLevel
-
Solo está presente en versiones de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::BOOT_PATCHLEVEL
que usa un valor de ID de etiqueta de 719.Especifica el nivel de parche de seguridad de la imagen del kernel que debe instalarse en el dispositivo para que se use esta clave. El valor aparece en el formato AAAAMMDD, que representa la fecha del parche de seguridad del sistema. Por ejemplo, si una clave se hubiera generado en un dispositivo Android con el parche de seguridad del 5 de agosto de 2018 del sistema instalado, este valor sería 20180805.
-
deviceUniqueAttestation
-
Solo está presente en versiones de certificación de claves >= 4.
Corresponde a la etiqueta de autorización
Tag::DEVICE_UNIQUE_ATTESTATION
que usa un valor de ID de etiqueta de 720.
RootOfTrust
Este conjunto de valores define información clave sobre el estado del dispositivo.
Cada uno de los campos de la siguiente lista es obligatorio:
-
verifiedBootKey
-
Un hash seguro de la clave que verifica la imagen del sistema. Se recomienda que uses el algoritmo SHA-256 para este hash.
-
deviceLocked
- Se presenta cuando el bootloader del dispositivo está bloqueado, lo cual habilita la comprobación de inicio verificado y evita que se transmita al dispositivo una imagen del dispositivo sin firmar. Para obtener más información sobre esta función, consulta la documentación de inicio verificado.
-
verifiedBootState
- Estado de inicio del dispositivo, según la función de inicio verificado.
-
verifiedBootHash
-
Solo está presente en la versión de certificación 3.
Es un resumen de todos los datos protegidos por el inicio verificado. Para dispositivos que usan la implementación del inicio verificado de Android, este valor contiene el resumen de VBMeta struct, o la estructura de metadatos del inicio verificado.
Para obtener más información acerca de cómo calcular este valor, consulta el Resumen de VBMeta.
VerifiedBootState
Esta estructura de datos proporciona el estado de inicio actual del dispositivo, que representa el nivel de protección proporcionado al usuario y a las apps una vez que el dispositivo termina de iniciarse. Para obtener más información sobre esta función, consulta la sección del estado de inicio en la documentación del inicio verificado.
Esta estructura de datos es una enumeración, por lo cual adquiere exactamente uno de los siguientes valores:
- Verificada
-
Indica una cadena completa de confianza, que incluye el bootloader, la partición de inicio y todas las particiones verificadas.
Cuando el dispositivo se encuentra en este estado de inicio,
verifiedBootKey
es el hash del certificado integrado en el dispositivo, que el fabricante de este último agrega a la ROM del dispositivo en la fábrica. - Autofirmado
-
Indica que el certificado integrado en el dispositivo verificó la partición de inicio del dispositivo y que la firma es válida.
Cuando el dispositivo se encuentra en este estado de inicio,
verifiedBootKey
es el hash de un certificado instalado por el usuario, que firma una partición de inicio que el usuario agrega al dispositivo en lugar de la partición de inicio original proporcionada por el fabricante. - Sin verificar
- Indica que el usuario puede modificar el dispositivo libremente. Por lo tanto, el usuario es responsable de verificar la integridad del dispositivo.
- Con errores
-
Indica que el dispositivo no superó la verificación. La certificación nunca debe usar este valor para
VerifiedBootState
.
AttestationApplicationId
Esta estructura de datos refleja la creencia de la plataforma de Android de que las apps pueden usar el material de clave secreta en la certificación. El ID puede comprender varios paquetes solo si estos comparten el mismo UID. La cadena del octeto se formatea según el siguiente esquema de ASN.1:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
- package_infos
-
Es un conjunto de objetos
AttestationPackageInfo
, cada uno de los cuales proporciona un nombre de paquete y un número de versión. - signature_digests
-
Un conjunto de resúmenes SHA-256 de los certificados de firma de la app. Una app puede tener varias cadenas de certificados de claves de firma. Para cada una, el certificado de "hoja" se resume y se coloca en el campo
signature_digests
. El nombre del campo es engañoso, ya que los datos resumidos son los certificados de firma de la app, no sus firmas, dado que recibe el nombre de la claseSignature
que muestra una llamada agetPackageInfo()
. El siguiente fragmento de código muestra un conjunto de ejemplo:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Esquema de datos de extensión de información de aprovisionamiento
La extensión de información de aprovisionamiento tiene OID 1.3.6.1.4.1.11129.2.1.30
. La extensión proporciona información que el servidor de aprovisionamiento conoce sobre el dispositivo. Esta extensión sigue un esquema del CDDL.
{ 1 : int, ; certificates issued }
El mapa no tiene versiones y se pueden agregar nuevos campos opcionales.
-
certs_issued
-
Cantidad aproximada de certificados emitidos al dispositivo en los últimos 30 días. Este valor se puede usar como una señal de posible abuso si el valor es mayor que el promedio en algunos órdenes de magnitud.