Verificar pares de chaves protegidos por hardware usando atestados de chaves

A confirmação de chaves dá a você a confiança de que as chaves usadas no app serão armazenadas em um keystore protegido por hardware no dispositivo. As seções abaixo descrevem como verificar as propriedades das chaves protegidas por hardware e como interpretar os dados de extensão dos certificados de atestado.

Observação: antes de verificar as propriedades das chaves protegidas por hardware de um dispositivo em um ambiente de produção, confira se o dispositivo tem suporte ao atestado de chaves no nível do hardware. Para isso, verifique se a cadeia de certificados de atestado contém um certificado raiz assinado pela chave raiz de atestado do Google e se o elemento attestationSecurityLevel na estrutura de dados de descrição de chaves foi definido para o nível de segurança TrustedEnvironment ou StrongBox.

Além disso, é importante verificar as assinaturas na cadeia de certificados e conferir a lista de status de revogação de certificados para confirmar se nenhuma das chaves na cadeia foi revogada. A menos que todas sejam válidas e a raiz seja a chave raiz do Google, não confie totalmente no atestado.

Extrair e verificar um par de chaves protegido por hardware

Durante o atestado de chaves, você especifica o alias de um par de chaves e extrai a cadeia de certificados, que pode ser usada para verificar as propriedades desse par.

Se o dispositivo oferecer suporte ao atestado de chaves no nível do hardware, o certificado raiz dessa cadeia será assinado usando uma chave raiz de atestado provisionada com segurança para o keystore protegido por hardware do dispositivo.

Observação: em dispositivos que incluem o atestado de chaves no nível do hardware, o Android 7.0 (nível 24 da API) ou mais recente e o Google Play Services, o certificado raiz é assinado pela chave raiz de atestado do Google. Verifique se esse certificado raiz está entre os listados na seção sobre certificados raiz.

Para implementar o atestado de chaves, siga estas etapas:

  1. Use o método getCertificateChain() de um objeto KeyStore para conferir uma referência à cadeia de certificados X.509 associada ao keystore protegido por hardware.
  2. Envie os certificados para um servidor separado confiável para validação.

    Cuidado:não conclua o processo de validação abaixo no mesmo dispositivo. Se o sistema Android no dispositivo for comprometido, o processo de validação poderá confiar em algo que não deveria.

  3. Extraia uma referência à biblioteca de análise e validação da cadeia de certificados X.509 que seja mais adequada para seu conjunto de ferramentas. Verifique se o certificado público raiz é confiável e se cada certificado assina o próximo na cadeia.

  4. Verifique o status de revogação de cada certificado para garantir que nenhum deles tenha sido revogado.

  5. Se quiser, inspecione a extensão do certificado de informações de provisionamento que está presente apenas nas cadeias de certificados mais recentes.

    Extraia uma referência à biblioteca de analisadores CBOR mais adequada para seu conjunto de ferramentas. Encontre o certificado mais próximo da raiz que contenha a extensão do certificado de informações de provisionamento. Use o analisador para extrair desse certificado os dados de extensão do certificado de informações de provisionamento.

    Consulte a seção sobre a extensão de informações de provisionamento para saber mais.

  6. Extraia uma referência à biblioteca de analisadores ASN.1 mais adequada para seu conjunto de ferramentas. Encontre o certificado mais próximo da raiz que contenha a extensão do certificado de atestado de chaves. Se a extensão do certificado de informações de provisionamento estiver presente, a extensão do certificado de atestado de chaves precisará estar no próximo certificado. Use o analisador para extrair os dados da extensão do certificado de atestado de chaves desse certificado.

    Cuidado:não presuma que a extensão do certificado de atestado de chaves está no certificado de folha da cadeia. Somente a primeira ocorrência da extensão na cadeia é confiável. Outras instâncias da extensão não foram emitidas pelo hardware seguro e podem ter sido emitidas por um invasor que estende a cadeia ao tentar criar atestados falsos para chaves não confiáveis.

    O exemplo de atestado de chave usa o analisador ASN.1 do Bouncy Castle (links em inglês) para extrair os dados de extensão de um certificado de atestado. Use esse exemplo como referência para criar seu próprio analisador.

    Consulte a seção sobre o esquema de dados da extensão de atestado de chaves para saber mais.

  7. Confira a consistência dos dados de extensão recuperados nas etapas anteriores e compare-os com o conjunto de valores que você espera encontrar na chave protegida por hardware.

Certificados raiz

A confiabilidade do atestado depende do certificado raiz da cadeia. Os dispositivos Android aprovados nos testes necessários para ter o conjunto de apps do Google, incluindo o Google Play, e lançados com o Android 7.0 (nível 24 da API) ou mais recente precisam usar as chaves de atestado assinadas pelo certificado raiz de atestado de hardware do Google. Observe que atestados não eram necessários até o Android 8.0 (nível 26 da API). O conjunto de certificados raiz válidos pode ser baixado como uma matriz formatada em JSON.

Certificados raiz

Os dois certificados raiz a seguir precisam ser usados como âncoras de confiança ao verificar uma cadeia de certificados de atestado de chave.

-----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-----

O certificado raiz a seguir vai começar a assinar cadeias de certificados de atestado em 1º de fevereiro de 2025.

-----BEGIN CERTIFICATE-----
MIICIjCCAaigAwIBAgIRAISp0Cl7DrWK5/8OgN52BgUwCgYIKoZIzj0EAwMwUjEc
MBoGA1UEAwwTS2V5IEF0dGVzdGF0aW9uIENBMTEQMA4GA1UECwwHQW5kcm9pZDET
MBEGA1UECgwKR29vZ2xlIExMQzELMAkGA1UEBhMCVVMwHhcNMjUwNzE3MjIzMjE4
WhcNMzUwNzE1MjIzMjE4WjBSMRwwGgYDVQQDDBNLZXkgQXR0ZXN0YXRpb24gQ0Ex
MRAwDgYDVQQLDAdBbmRyb2lkMRMwEQYDVQQKDApHb29nbGUgTExDMQswCQYDVQQG
EwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABCPaI3FO3z5bBQo8cuiEas4HjqCt
G/mLFfRT0MsIssPBEEU5Cfbt6sH5yOAxqEi5QagpU1yX4HwnGb7OtBYpDTB57uH5
Eczm34A5FNijV3s0/f0UPl7zbJcTx6xwqMIRq6NCMEAwDwYDVR0TAQH/BAUwAwEB
/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFFIyuyz7RkOb3NaBqQ5lZuA0QepA
MAoGCCqGSM49BAMDA2gAMGUCMETfjPO/HwqReR2CS7p0ZWoD/LHs6hDi422opifH
EUaYLxwGlT9SLdjkVpz0UUOR5wIxAIoGyxGKRHVTpqpGRFiJtQEOOTp/+s1GcxeY
uR2zh/80lQyu9vAFCj6E4AXc+osmRg==
-----END CERTIFICATE-----
  
Certificados raiz 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-----
  

Se o certificado raiz na cadeia de atestado recebida tiver essa chave pública e nenhum dos certificados da cadeia tiver sido revogado, você saberá que:

  1. sua chave está no hardware que o Google acredita ser seguro; e
  2. ela tem as propriedades descritas no certificado de confirmação.

Se a cadeia de atestado tiver qualquer outra chave pública raiz, o Google não fará nenhuma declaração sobre a segurança do hardware. Isso não significa que sua chave está comprometida, apenas que o atestado não prova que ela está em um hardware seguro. Ajuste suas suposições de segurança.

Se o certificado raiz não tiver a chave pública nesta página, há dois motivos prováveis:

  • O dispositivo provavelmente foi iniciado com uma versão do Android anterior à 7.0 e não oferece suporte ao atestado de hardware. Nesse caso, o Android tem uma implementação de software de atestado que produz o mesmo tipo de certificado de atestado, mas que é assinado com uma chave fixada no código-fonte do Android. Como essa chave de assinatura não é um segredo, o atestado pode ter sido criado por um invasor que finge fornecer hardware seguro.
  • O outro motivo provável é que o dispositivo não é um dispositivo do Google Play. Nesse caso, o criador do dispositivo é livre para criar a própria raiz e fazer as declarações que quiser sobre o significado do atestado. Consulte a documentação do fabricante do dispositivo. No momento, o Google não tem conhecimento de fabricantes de dispositivos que fizeram isso.

Rotação do certificado raiz de atestado de hardware

O Google está lançando um novo certificado raiz para o atestado de chaves do Android. Essa mudança aumenta a segurança e a confiabilidade do processo de atestado para aplicativos sensíveis. Uma nova chave raiz foi gerada para o atestado de chave do Android (KeyMint). A nova raiz é uma chave ECDSA P-384, e uma chave ML-DSA (algoritmo de assinatura digital pós-quântica) está planejada para o futuro.

Ação para desenvolvedores

  • Se o app depender da comprovação de chaves do Android, adicione o novo certificado raiz aos repositórios de confiança até janeiro de 2026. Faça o download dos certificados novos e antigos em https://android.googleapis.com/attestation/root.
  • Os dispositivos que usam o provisionamento remoto de chaves (RKP) começarão a receber certificados baseados nesse novo certificado em fevereiro de 2026. Os dispositivos compatíveis com RKP vão usar exclusivamente a nova raiz até 10 de abril de 2026.
  • Atualize seus processos de atestado para confiar nos dois certificados raiz, novos e atuais. Dispositivos mais antigos com chaves provisionadas de fábrica não são compatíveis com a rotação de chaves e continuam usando a raiz antiga.
  • O esquema da extensão do certificado não vai mudar, apenas a raiz.
  • As formas legíveis por humanos e por máquinas da nova raiz estarão disponíveis publicamente.

Práticas recomendadas

Não consulte um endpoint para raízes confiáveis durante a execução, porque isso cria riscos de segurança. Lide com mudanças nas raízes de confiança por um processo formal.

Eliminação gradual das chaves de fábrica: provisionamento de chaves remotas (RKP)

Para dispositivos lançados com o Android 16, o sistema oferece suporte apenas ao RKP. Essa política elimina gradualmente as chaves de fábrica. Ele melhora o provisionamento e o gerenciamento de chaves de atestado, expandindo a política do Android 15, em que o suporte a RKP era opcional. O RKP evita o vazamento de chaves porque o sistema não programa chaves diretamente no dispositivo. Não é possível excluir essas chaves do dispositivo. Se for necessário revogar uma chave, você poderá segmentar a revogação para um único dispositivo.

Bibliotecas de verificação de atestado

Use a biblioteca de verificação de atestado Kotlin para verificar as cadeias de certificados de atestado de chave. Além disso, essa biblioteca já integra os novos certificados raiz. Se você estiver usando um verificador diferente, recomendamos migrar para a biblioteca Kotlin. Ele é bem testado e abrange casos extremos que geralmente são ignorados por verificadores personalizados.

Lista de status de revogação de certificado

As chaves de atestado podem ser revogadas por vários motivos, incluindo manuseio incorreto ou extração suspeita por um invasor. É fundamental que o status de cada certificado em uma cadeia de atestado seja verificado na lista oficial de status de revogação de certificado (CRL). Essa lista é mantida pelo Google e publicada em https://android.googleapis.com/attestation/status. O cabeçalho Cache-Control na resposta HTTP determina a frequência da verificação de atualizações, ou seja, uma solicitação de rede não é necessária para todos os certificados que estão sendo verificados. Esse URL retorna um arquivo JSON contendo o status de revogação para todos os certificados que não têm um status válido normal. O formato do arquivo JSON segue esta definição de esquema JSON (rascunho 07, link em inglês):

{
  "$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
}

Exemplo 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"
    }
  }
}

Política de revogação de certificados

A comprovação forma a base da proteção contra abusos e da confiança no ecossistema Android. Ele fornece uma declaração criptograficamente verificável a terceiros fora do dispositivo sobre o estado inicializado dele.

Os certificados das chaves de atestado do Android serão revogados quando as chaves forem comprometidas, devido à natureza crítica da validade do atestado. Esta seção descreve uma política para quando os certificados são revogados. Essa política provavelmente vai evoluir e enumerar outros casos com o tempo.

O que se qualifica para revogação?

Os vazamentos de chaves de atestado afetam apenas o mecanismo de provisionamento mais antigo compatível com o Android e não se aplicam a chaves de atestado certificadas pelo mecanismo mais recente de provisionamento remoto de chaves (RKP, na sigla em inglês).

As chaves de comprovação vazadas sempre podem ter os certificados revogados. Os vazamentos podem ser descobertos de várias maneiras, incluindo:

  • Análise de dados de atestado em situações reais.
  • Descoberta de chaves de comprovação em redes sociais ou outros sites públicos.
  • Relatórios diretos de pesquisadores de segurança.

Após a descoberta, os certificados de comprovação serão revogados com a adição dos números de série à lista de revogação. Normalmente, isso acontece em alguns dias após a descoberta, mas pode levar mais tempo em casos raros. Por exemplo, a revogação de certificados para chaves de atestado vazadas geralmente é adiada se os dispositivos afetados puderem ser reprovisionados com segurança. A escala do impacto da revogação também é um fator importante nos cronogramas de revogação.

Esquema de dados de extensão de atestado de chaves

Esquema de dados de extensão de informações do provisionamento