利用密钥认证,对于将应用中使用的密钥存储在设备硬件支持的密钥库中这一做法,您可以更加放心。下面几部分介绍了如何验证硬件支持的密钥的属性,以及如何解释认证证书的扩展数据。
注意:在生产级环境中为设备验证硬件支持的密钥的属性前,您应确保设备支持硬件级密钥认证。为此,您需要确认认证证书链包含用 Google 认证根密钥签名的根证书,且密钥描述数据结构中的 attestationSecurityLevel
元素被设置为 TrustedEnvironment
安全等级。
此外,请务必验证证书链中的签名,并查看证书吊销状态列表,确认证书链中没有密钥被吊销。除非所有密钥均有效且根是 Google 根密钥,否则请勿完全信任认证。但是请注意,包含已吊销的证书的设备至少和仅支持软件认证的设备一样可信。在可信度方面,具有完全有效的认证是强有力的正面指标,但没有完全有效的认证则属于一般情况,并非是负面指标。
检索和验证硬件支持的密钥对
在密钥认证期间,您可以指定密钥对的别名并检索其证书链,证书链可用于验证该密钥对的属性。
如果设备支持硬件级密钥认证,将使用认证根密钥为此证书链中的根证书签名,而该根密钥已安全配置到设备的硬件支持的密钥库。
注意:在附带硬件级密钥认证、搭载 Android 7.0(API 级别 24)或更高版本以及预装 Google Play 服务的设备上,根证书使用 Google 认证根密钥签名。验证此根证书是否属于根证书部分中列出的证书之一。
如需实现密钥认证,请完成以下步骤:
-
使用
KeyStore
对象的getCertificateChain()
方法获取指向 X.509 证书链的引用,该证书链与硬件支持的密钥库关联。 -
将证书发送到您信任的独立服务器进行验证。
注意:请不要在密钥库所在的设备上完成以下验证流程。原因在于一旦相应设备上的 Android 系统遭到入侵,可能会导致验证流程信任不可信的内容。
-
获取对您的工具集来说最适合的 X.509 证书链解析和验证库的引用。验证根公共证书是否可信,以及每个证书是否签署了证书链中的下一个证书。
-
检查每个证书的吊销状态,确保所有证书都没有被吊销。
-
可选择检查配置信息证书扩展(仅存在于较新的证书链中)。
获取指向最适合您工具集的 CBOR 解析器库的引用。找到包含配置信息证书扩展并且最接近根证书的证书。使用解析器从该证书中提取配置信息证书扩展数据。
如需了解详情,请参阅配置信息扩展数据架构部分。
-
获取指向最适合您工具集的 ASN.1 解析器库的引用。找到包含密钥认证证书扩展并且最接近根证书的证书。如果存在配置信息证书扩展,则密钥认证证书扩展一定位于紧随其后的证书中。使用解析器从该证书中提取密钥认证证书扩展数据。
注意:请勿假定密钥认证证书扩展位于证书链的叶证书中。扩展只有在证书链中首次出现时才可信。扩展的任何后续实例都不是由安全硬件发出的,而可能是对证书链进行扩展的攻击者在尝试为不受信任的密钥创建虚假认证时发出的。
该密钥认证示例使用 Bouncy Castle 中的 ASN.1 解析器提取认证证书的扩展数据。在创建您自己的解析器时,您可以将此示例用作参考。
如需了解详情,请参阅密钥认证扩展数据架构部分。
-
请检查您在前面步骤中检索到的扩展数据,确保一致性,并与您希望在硬件支持的密钥中包含的一组值进行比较。
根证书
认证的可信度取决于证书链的根证书。对于已通过预装 Google 一系列应用(包括 Google Play)所需测试的 Android 设备,以及搭载 Android 7.0(API 级别 24)或更高版本的设备,应使用 Google 硬件认证根证书签名的认证密钥。请注意,如果设备搭载低于 Android 8.0(API 级别 26)的系统,则不需要进行认证。根公钥如下所示:
-----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-----
之前颁发的根证书
-----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-----
如果您收到的认证链中的根证书包含此公钥,而且认证链中的所有证书均未被撤消,您就可以知道:
- 您的密钥位于 Google 认为安全的硬件中;而且
- 它具有认证证书中说明的属性。
如果认证链具有任何其他根公钥,Google 不会对硬件的安全性做出任何声明。这并不意味着您的密钥被盗,只是认证并不能证明密钥位于安全硬件中。您应该相应地调整安全假设。
如果根证书不包含此页面上的公钥,可能有两个原因:
- 最可能的原因是,设备搭载的 Android 版本低于 7.0,而且不支持硬件认证。在这种情况下,Android 提供软件实现的认证,它可以生成相同类型的认证证书,但使用的是在 Android 源代码中硬编码的密钥进行签名。由于此签名密钥不是私密的,因此认证可能是假装提供安全硬件的攻击者创建的。
- 另一个可能的原因是设备不是 Google Play 设备。在这种情况下,设备制造商可以自由创建他们自己的根证书,并按照自己的意愿就认证的意义做出声明。有关具体情况,请参阅相应设备制造商的文档。请注意,在撰写本文时,Google 未发现有任何设备制造商采用这种做法。
证书吊销状态列表
认证密钥可能因多种原因被吊销,包括处理不当或怀疑被攻击者提取。因此,请务必根据官方证书吊销状态列表 (CRL) 检查认证链中每个证书的状态。此列表由 Google 维护,并发布在以下网址:https://android.googleapis.com/attestation/status。HTTP 响应中的 Cache-Control
标头决定了检查更新的频率,因此不需要为每个要验证的证书发出网络请求。该网址会返回一个 JSON 文件,其中包含任何不具有正常有效状态的证书的吊销状态。该 JSON 文件的格式遵循以下 JSON 架构(草稿 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 }
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
嵌入在旧版认证证书中的 CRL 网址继续有效。新的认证证书不会再包含 CRL 网址扩展。旧版证书的状态也包含在认证状态列表中,从而使开发者可以放心地使用该列表检查新版和旧版证书的状态。密钥认证示例中提供了有关如何正确验证 Android 认证密钥的示例。
密钥认证扩展数据架构
密钥认证扩展的 OID 为 1.3.6.1.4.1.11129.2.1.17
。此扩展按照 ASN.1 架构存储信息。如要查看与您使用的认证版本对应的架构,请在下面列出的架构中选择相应标签:
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), }
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), }
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), }
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), }
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), }
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), }
以下列表对该架构中的每个元素进行了说明:
KeyDescription
值的这一顺序提供了有关通过密钥认证进行验证的密钥对的常规信息,并且可以轻松访问其他详情。
-
attestationVersion
-
密钥认证功能的版本。
值 版本 1 Keymaster 版本 2.0 2 Keymaster 版本 3.0 3 Keymaster 版本 4.0 4 Keymaster 版本 4.1 100 KeyMint 版本 1.0 200 KeyMint 版本 2.0 -
attestationSecurityLevel
-
认证的安全等级。
警告:尽管可以认证存储在 Android 系统中的密钥(即,当
attestationSecurityLevel
的值设置为 Software 时),但如果 Android 系统受到攻击,您将不能信任这些认证。 -
keymasterVersion
/keyMintVersion
- Keymaster 或 KeyMint 硬件抽象层 (HAL) 的版本。
值 版本 0 Keymaster 版本 0.2 或 0.3 1 Keymaster 版本 1.0 2 Keymaster 版本 2.0 3 Keymaster 版本 3.0 4 Keymaster 版本 4.0 41 Keymaster 版本 4.1 100 KeyMint 版本 1.0 200 KeyMint 版本 2.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Keymaster/KeyMint 实现的 安全等级。
-
attestationChallenge
-
包含创建密钥时提供的质询。检查此值是否与您的服务器提供的值(存储在
Tag::ATTESTATION_CHALLENGE
授权标记中)匹配。否则,您的服务可能容易受到旧认证证书重放的攻击。 -
uniqueId
-
此值用于标识设备,但只能在限定时间段内使用。此值通过计算得出,而且只能由系统应用使用。在所有其他应用中,
uniqueId
为空。 -
softwareEnforced
- 可选。由 Android 系统(而非设备的可信执行环境 [TEE])强制执行的 Keymaster/KeyMint 授权列表。
-
teeEnforced
- 可选。由设备的 TEE 强制执行的 Keymaster/KeyMint 授权列表。
SecurityLevel
此数据结构表示软件功能(例如密钥对)受保护的程度基于其在设备中的位置。
因为该数据结构是一个枚举,所以它可以准确获取以下某个值:
- 软件
- 用于创建和管理功能的逻辑在 Android 系统中实现。如果用于创建和存储密钥对,此位置没有 TEE 安全,但比应用的进程空间安全。
- TrustedEnvironment
- 用于创建和管理在安全硬件(如 TEE)中实现的功能的逻辑。如果用于创建和存储密钥对,此位置比较安全,因为安全硬件更能抵御远程攻击。
- StrongBox
- 用于创建和管理功能的逻辑在专用硬件安全模块中实现。对于创建和存储密钥对,此位置更安全,因为它更能抵御远程攻击和针对模块的硬件攻击。
AuthorizationList
此数据结构包含密钥对的属性本身,如 Keymaster 或 KeyMint 硬件抽象层 (HAL) 中所定义。将这些值与设备的当前状态或一组预期值进行比较,以验证密钥对是否仍适用于您的应用。
每个字段名称对应一个名称相似的 Keymaster/KeyMint 授权标记。
例如,授权列表中的 keySize
字段与 Tag::KEY_SIZE
授权标记对应。
以下列表中的每个字段都是可选字段:
-
purpose
-
与
Tag::PURPOSE
授权标记对应,其使用的标记 ID 值为 1。 -
algorithm
-
与
Tag::ALGORITHM
授权标记对应,其使用的标记 ID 值为 2。在认证
AuthorizationList
对象中,算法值始终为RSA
或EC
。 -
keySize
-
与
Tag::KEY_SIZE
授权标记对应,其使用的标记 ID 值为 3。 -
digest
-
与
Tag::DIGEST
授权标记对应,其使用的标记 ID 值为 5。 -
padding
-
与
Tag::PADDING
授权标记对应,其使用的标记 ID 值为 6。 -
ecCurve
-
与
Tag::EC_CURVE
授权标记对应,其使用的标记 ID 值为 10。Android 系统密钥库中用于生成椭圆曲线 (EC) 密钥对的参数集,该参数集使用 ECDSA 进行签名和验证。
-
rsaPublicExponent
-
与
Tag::RSA_PUBLIC_EXPONENT
授权标记对应,其使用的标记 ID 值为 200。 -
mgfDigest
-
仅存在于密钥认证版本 100 或更高版本中。
与Tag::RSA_OAEP_MGF_DIGEST
KeyMint 授权标记对应,其使用的标记 ID 值为 203。 -
rollbackResistance
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::ROLLBACK_RESISTANT
授权标记对应,其使用的标记 ID 值为 303。 -
earlyBootOnly
-
仅存在于密钥认证版本 4 或更高版本中。
与
Tag::EARLY_BOOT_ONLY
授权标记对应,其使用的标记 ID 值为 305。 -
activeDateTime
-
与
Tag::ACTIVE_DATETIME
授权标记对应,其使用的标记 ID 值为 400。 -
originationExpireDateTime
-
与
Tag::ORIGINATION_EXPIRE_DATETIME
授权标记对应,其使用的标记 ID 值为 401。 -
usageExpireDateTime
-
与
Tag::USAGE_EXPIRE_DATETIME
授权标记对应,其使用的标记 ID 值为 402。 -
usageCountLimit
-
与
Tag::USAGE_COUNT_LIMIT
授权标记对应,其使用的标记 ID 值为 405。 -
noAuthRequired
-
与
Tag::NO_AUTH_REQUIRED
授权标记对应,其使用的标记 ID 值为 503。 -
userAuthType
-
与
Tag::USER_AUTH_TYPE
授权标记对应,其使用的标记 ID 值为 504。 -
authTimeout
-
与
Tag::AUTH_TIMEOUT
授权标记对应,其使用的标记 ID 值为 505。 -
allowWhileOnBody
-
与
Tag::ALLOW_WHILE_ON_BODY
授权标记对应,其使用的标记 ID 值为 506。如果用户身上仍佩戴着设备,允许在密钥身份验证超时后使用密钥。请注意,安全的体感传感器可以确定设备是否正佩戴在用户身上。
-
trustedUserPresenceRequired
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::TRUSTED_USER_PRESENCE_REQUIRED
授权标记对应,其使用的标记 ID 值为 507。规定仅在用户提供了物理存在证明时,此密钥才可用。以下是此类情况的几个示例:
- 对于 StrongBox 密钥,以硬连接的方式将硬件按钮连接到 StrongBox 设备上的 PIN 码。
- 对于 TEE 密钥,只要 TEE 拥有对扫描器的独占控制权并执行指纹匹配过程,指纹身份验证就会提供存在证明。
-
trustedConfirmationRequired
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::TRUSTED_CONFIRMATION_REQUIRED
授权标记对应,其使用的标记 ID 值为 508。规定仅在用户确认使用审批令牌为数据签名时,此密钥才可用。如需详细了解如何获取用户确认,请参阅 Android Protected Confirmation。
注意:此标记仅适用于目的为
SIGN
的密钥。 -
unlockedDeviceRequired
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::UNLOCKED_DEVICE_REQUIRED
授权标记对应,其使用的标记 ID 值为 509。 -
allApplications
-
与
Tag::ALL_APPLICATIONS
授权标记对应,其使用的标记 ID 值为 600。指示设备上的所有应用是否都可以访问密钥对。
-
applicationId
-
与
Tag::APPLICATION_ID
授权标记对应,其使用的标记 ID 值为 601。 -
creationDateTime
-
与
Tag::CREATION_DATETIME
授权标记对应,其使用的标记 ID 值为 701。 -
origin
-
与
Tag::ORIGIN
授权标记对应,其使用的标记 ID 值为 702。 -
rollbackResistant
-
仅存在于密钥认证版本 1 和 2 中。
与
Tag::ROLLBACK_RESISTANT
授权标记对应,其使用的标记 ID 值为 703。 -
rootOfTrust
-
与
Tag::ROOT_OF_TRUST
授权标记对应,其使用的标记 ID 值为 704。如需了解更多详情,请参阅介绍 RootOfTrust 数据结构的部分。
-
osVersion
-
与
Tag::OS_VERSION
授权标记对应,其使用的标记 ID 值为 705。与 Keymaster 关联的 Android 操作系统的版本,使用一个 6 位整数表示。例如,版本 8.1.0 表示为 080100。
只有 Keymaster 版本 1.0 或更高版本在授权列表中包含此值。
-
osPatchLevel
-
与
Tag::PATCHLEVEL
授权标记对应,其使用的标记 ID 值为 706。与 Keymaster 中使用的安全补丁关联的月份和年度,使用一个 6 位整数表示。例如,2018 年 8 月的补丁表示为 201808。
只有 Keymaster 版本 1.0 或更高版本在授权列表中包含此值。
-
attestationApplicationId
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_APPLICATION_ID
授权标记对应,其使用的标记 ID 值为 709。如需了解更多详情,请参阅介绍 AttestationApplicationId 数据结构的部分。
-
attestationIdBrand
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_BRAND
Keymaster 标记对应,其使用的标记 ID 值为 710。 -
attestationIdDevice
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_DEVICE
Keymaster 标记对应,其使用的标记 ID 值为 711。 -
attestationIdProduct
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_PRODUCT
Keymaster 标记对应,其使用的标记 ID 值为 712。 -
attestationIdSerial
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_SERIAL
Keymaster 标记对应,其使用的标记 ID 值为 713。 -
attestationIdImei
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_IMEI
授权标记对应,其使用的标记 ID 值为 714。 -
attestationIdMeid
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_MEID
授权标记对应,其使用的标记 ID 值为 715。 -
attestationIdManufacturer
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_MANUFACTURER
授权标记对应,其使用的标记 ID 值为 716。 -
attestationIdModel
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_MODEL
授权标记对应,其使用的标记 ID 值为 717。 -
vendorPatchLevel
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::VENDOR_PATCHLEVEL
授权标记对应,其使用的标记 ID 值为 718。规定为了使用此密钥而必须在设备上安装的供应商映像安全补丁级别。此值以 YYYYMMDD 的形式显示,表示供应商安全补丁的日期。例如,如果密钥在 Android 设备上生成,且相应设备安装了供应商于 2018 年 8 月 1 日提供的安全补丁,其值将表示为 20180801。
-
bootPatchLevel
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::BOOT_PATCHLEVEL
授权标记对应,其使用的标记 ID 值为 719。规定为了使用此密钥而必须在设备上安装的内核映像安全补序级别。此值以 YYYYMMDD 的形式显示,表示系统安全补丁的日期。例如,如果密钥在 Android 设备上生成,且相应设备安装了系统于 2018 年 8 月 5 日提供的安全补丁,其值将表示为 20180805。
-
deviceUniqueAttestation
-
仅存在于密钥认证版本 4 或更高版本中。
与
Tag::DEVICE_UNIQUE_ATTESTATION
授权标记对应,其使用的标记 ID 值为 720。
RootOfTrust
这个值集合可以定义与设备状态有关的密钥信息。
以下列表中的每个字段都是必选字段:
-
verifiedBootKey
-
验证系统映像的密钥的安全哈希值。建议您针对此哈希值使用 SHA-256 算法。
-
deviceLocked
- 在设备的引导加载程序处于锁定状态时为 true,这将启用启动时验证检查,并防止将未签名的设备映像刷写到设备上。如需详细了解此功能,请参阅启动时验证文档。
-
verifiedBootState
- 设备的启动状态(按照启动时验证功能)
-
verifiedBootHash
-
仅存在于密钥认证版本 3 中。
受启动时验证保护的所有数据的摘要。对于使用 Android 启动时验证功能实现(针对启动时验证功能)的设备,此值包含 VBMeta 结构或启动时验证元数据结构的摘要。
如需详细了解如何计算此值,请参阅 VBMeta 摘要。
VerifiedBootState
此数据结构提供设备的当前启动状态,表示在设备完成启动后为用户和应用提供的保护级别。如需详细了解此功能,请参阅“启动时验证”文档中的启动状态部分。
此数据结构是一个枚举,它可以准确获取以下某个值:
- 已验证
-
用于指明完整的信任链,其中包含引导加载程序、启动分区和所有已验证的分区。
当设备处于此启动状态时,
verifiedBootKey
是嵌入式设备证书的哈希值,设备制造商已在出厂时将其添加到设备的 ROM 中。 - SelfSigned
-
用于指明嵌入式设备证书已验证设备的启动分区及签名有效。
当设备处于此启动状态时,
verifiedBootKey
是用户安装的证书的哈希值,它将为一个启动分区签名,用户可以将其添加到设备中代替制造商提供的原始启动分区。 - 未验证
- 用于指明用户可以随意修改设备。因此,用户应负责验证设备的完整性。
- 失败
-
用于指明设备验证失败。认证证书决不能将此值用作
VerifiedBootState
。
AttestationApplicationId
此数据结构反映了 Android 平台允许哪些应用使用认证中的密钥材料。当且仅当多个软件包共享同一 UID 时,此 ID 才可以包含多个软件包。这一八位字节的字符串本身按照以下 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
-
一组
AttestationPackageInfo
对象,每个对象都提供软件包名称和版本号。 - signature_digests
-
应用签名证书的一组 SHA-256 摘要。一个应用可以有多个签名密钥证书链。对于每个证书,系统都会为“叶”证书生成摘要,并将其放入
signature_digests
字段中。字段名称具有误导性,因为摘要数据是应用的签名证书,而不是应用签名,原因在于它是根据getPackageInfo()
调用返回的Signature
类而命名的。 以下代码段展示了一个摘要集的示例:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
配置信息扩展数据架构
配置信息扩展的 OID 为 1.3.6.1.4.1.11129.2.1.30
。该扩展可提供配置服务器已知的设备信息。该扩展采用 CDDL 架构。
{ 1 : int, ; certificates issued }
该映射没有版本信息,可以添加新的可选字段。
-
certs_issued
-
过去 30 天内向设备颁发的证书的大致数量。如果此值比平均值大出几个数量级,则可以将其当作潜在滥用的信号。