使用密钥证明验证硬件支持的密钥对

密钥证明使您更有信心,您在应用中使用的密钥存储在设备的硬件支持的密钥库中。以下部分介绍如何验证硬件支持的密钥的属性以及如何解释证明证书的扩展数据。

注意:在生产级环境中验证设备的硬件支持密钥的属性之前,请确保设备支持硬件级密钥证明。为此,请检查证明证书链是否包含使用 Google 证明根密钥签名的根证书,以及 attestationSecurityLevel 元素是否在 密钥描述 数据结构中设置为 TrustedEnvironment 安全级别或 StrongBox 安全级别。

此外,重要的是验证证书链中的签名,并通过检查 证书吊销状态列表 确认链中的任何密钥都没有被吊销。除非所有证书都是有效的,并且根证书是 Google 根密钥,否则不要完全信任证明。但是请注意,包含吊销证书的设备至少与仅支持软件证明的设备一样可信。具有完全有效的证明是一个强烈的积极指标。没有证明是一个中性的(不是负面的)指标。

检索和验证硬件支持的密钥对

在密钥证明期间,您指定密钥对的别名并检索其证书链,您可以使用该链来验证该密钥对的属性。

如果设备支持硬件级密钥证明,则此链中的根证书使用安全地配置到设备的硬件支持的密钥库中的证明根密钥签名。

注意:在预装了硬件级密钥证明的设备上(Android 7.0(API 级别 24)或更高版本,以及 Google Play 服务),根证书使用 Google 证明根密钥签名。验证此根证书是否包含在有关 根证书 的部分中列出的证书中。

要实现密钥证明,请完成以下步骤

  1. 使用 KeyStore 对象的 getCertificateChain() 方法获取与硬件支持的密钥库关联的 X.509 证书链的引用。
  2. 将证书发送到您信任的用于验证的单独服务器。

    注意:不要在与 KeyStore 相同的设备上完成以下验证过程。如果该设备上的 Android 系统遭到破坏,这可能会导致验证过程信任不可信的内容。

  3. 获取对最适合您的工具集的 X.509 证书链解析和验证库的引用。验证根公钥是否可信,以及每个证书是否都对链中的下一个证书进行签名。

  4. 检查每个证书的 吊销状态,以确保没有证书被吊销。

  5. 可选地,检查仅在较新的证书链中存在的配置信息证书扩展。

    获取对最适合您的工具集的 CBOR 解析器库的引用。找到最接近根的包含 配置信息证书扩展 的证书。使用解析器从该证书中提取配置信息证书扩展数据。

    有关 配置信息扩展数据模式 的更多详细信息,请参阅相关部分。

  6. 获取最适合您的工具集的 ASN.1 解析器库的引用。找到最接近根证书的证书,该证书包含 密钥证明证书扩展。如果存在配置信息证书扩展,则密钥证明证书扩展必须位于紧随其后的证书中。使用解析器从该证书中提取密钥证明证书扩展数据。

    注意: 不要假设密钥证明证书扩展位于链的叶证书中。链中扩展的第一次出现才是可信的。扩展的任何后续实例都没有由安全硬件发出,可能由攻击者在尝试为不受信任的密钥创建假证明时扩展链而发出。

    密钥证明示例 使用来自 Bouncy Castle 的 ASN.1 解析器提取证明证书的扩展数据。您可以使用此示例作为创建您自己的解析器的参考。

    有关 密钥证明扩展数据模式 的更多详细信息,请参阅相关部分。

  7. 检查您在上一步中检索的扩展数据是否一致,并将其与您期望硬件支持的密钥包含的值集进行比较。

根证书

证明的可靠性取决于链的根证书。通过了 Google 应用套件(包括 Google Play)测试并从 Android 7.0(API 级别 24)或更高版本启动的 Android 设备应使用由 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-----
  

如果您收到的证明链中的根证书包含此公钥,并且链中的任何证书都没有 吊销,那么您知道

  1. 您的密钥位于 Google 认为安全的硬件中;并且
  2. 它具有证明证书中描述的属性。

如果证明链有任何其他根公钥,则 Google 不会对硬件的安全提出任何主张。这并不意味着您的密钥被泄露,只是证明不能证明密钥位于安全硬件中。相应地调整您的安全假设。

如果根证书不包含此页面上的公钥,则可能有以下两种原因

  • 最有可能的是,设备启动时使用的 Android 版本低于 7.0,不支持硬件证明。在这种情况下,Android 有一个证明的软件实现,它会生成相同类型的证明证书,但使用 硬编码在 Android 源代码中 的密钥进行签名。由于此签名密钥不是秘密,因此证明可能由假装提供安全硬件的攻击者创建。
  • 另一个可能的原因是该设备不是 Google Play 设备。在这种情况下,设备制造商可以自由创建他们自己的根并对证明的含义提出任何主张。请参阅设备制造商的文档。请注意,截至撰写本文时,Google 尚未发现任何进行过此操作的设备制造商。

证书吊销状态列表

证明密钥可能因多种原因被吊销,包括处理不当或怀疑被攻击者提取。因此,必须根据官方证书吊销状态列表 (CRL) 检查证明链中每个证书的状态。此列表由 Google 维护,并在以下位置发布: https://android.googleapis.com/attestation/status。HTTP 响应中的 Cache-Control 标头决定检查更新的频率,因此并非每个要验证的证书都需要网络请求。此 URL 返回一个 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 URL 继续运行。新的证明证书不再包含 CRL URL 扩展。旧版证书的状态也包含在证明状态列表中,因此开发人员可以安全地切换到使用证明状态列表来验证新旧证书。 密钥证明示例 中包含了如何正确验证 Android 证明密钥的示例。

密钥证明扩展数据模式

密钥证明扩展具有 OID 1.3.6.1.4.1.11129.2.1.17。扩展根据 ASN.1 模式存储信息。要查看与您正在使用的证明版本相对应的模式,请在以下模式列表中选择相应的选项卡

版本 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

版本 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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),
}

版本 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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),
}

版本 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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,
    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),
}

版本 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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,
    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),
}

版本 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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,
    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),
}

版本 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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,
    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
密钥证明功能的版本。
ValueVersion
1Keymaster 版本 2.0
2Keymaster 版本 3.0
3Keymaster 版本 4.0
4Keymaster 版本 4.1
100KeyMint 版本 1.0
200KeyMint 版本 2.0
300KeyMint 版本 3.0
attestationSecurityLevel

证明的 安全级别

警告: 虽然可以证明存储在 Android 系统中的密钥(即,如果 attestationSecurityLevel 的值为软件),但如果 Android 系统遭到破坏,您不能信任这些证明。

keymasterVersion / keyMintVersion
Keymaster 或 KeyMint 硬件抽象层 (HAL) 的版本。
ValueVersion
0Keymaster 版本 0.2 或 0.3
1Keymaster 版本 1.0
2Keymaster 版本 2.0
3Keymaster 版本 3.0
4Keymaster 版本 4.0
41Keymaster 版本 4.1
100KeyMint 版本 1.0
200KeyMint 版本 2.0
300KeyMint 版本 3.0
keymasterSecurityLevel / keyMintSecurityLevel
Keymaster/KeyMint 实现的 安全级别
attestationChallenge
包含在密钥创建时提供的挑战。检查此值是否与您的服务器提供的存储在 Tag::ATTESTATION_CHALLENGE 授权标记中的值匹配。否则,您的服务可能容易受到旧证明证书重播攻击。
uniqueId
此值标识设备 - 但仅在有限的时间段内。它被 计算 并且仅由系统应用使用。在所有其他应用中,uniqueId 为空。
softwareEnforced
可选。由 Android 系统(而不是设备的可信执行环境 (TEE))强制执行的 Keymaster / KeyMint 授权列表。此授权列表中的信息由平台代码收集或生成,并存储在设备的系统分区中。只要设备运行符合 Android 平台安全模型的操作系统,就可以信任此授权列表的内容。所有经过认证的 Android 设备都符合此安全模型,因此如果设备被锁定并且经过验证的启动状态为 Verified,那么此处的这些值应该是可靠的。在修改过的设备上,如果引导加载程序被解锁,用户可以安装不符合 Android 平台安全模型的操作系统,因此此字段中的值可能由用户任意选择。
hardwareEnforced
可选。由设备的可信执行环境 (TEE) 强制执行的 Keymaster / KeyMint 授权列表。此授权列表中的信息由安全硬件代码收集或生成,不受平台控制。例如,此授权列表中的信息来自设备的引导加载程序或设备上运行的 TEE。此授权列表中不是由 KeyMint 直接设置的字段由安全硬件的其他部分(例如,引导加载程序)通过不依赖于信任平台的安全通信通道提供。安全硬件与 Android 系统之间的区别在于,用户无法修改在安全硬件(固件)中运行的代码,因此用户无法破坏此授权列表中的值。

SecurityLevel

此数据结构指示基于软件功能(例如,密钥对)在设备中的位置,其保护程度。

由于数据结构是一个枚举,因此它正好采用以下值之一

Keystore
创建和管理功能的逻辑是在 Android 系统中实现的。出于创建和存储密钥对的目的,此位置不如 TEE 安全,但比您的应用进程空间更安全。
TrustedEnvironment
创建和管理功能的逻辑是在安全硬件(例如,TEE)中实现的。出于创建和存储密钥对的目的,此位置更安全,因为安全硬件可以高度抵御远程入侵。
StrongBox
创建和管理功能的逻辑是在专用的 硬件安全模块 中实现的。出于创建和存储密钥对的目的,此位置更安全,因为它可以高度抵御远程入侵和针对模块的硬件攻击。
Software
创建和管理功能的逻辑是在不运行在安全环境中的 KeyMint 或 Keymaster 实现中实现的。出于创建和存储密钥对的目的,此位置不如 TEE 安全,但比您的应用进程空间更安全。

AuthorizationList

此数据结构包含密钥对本身的属性,如 Keymaster 或 KeyMint 硬件抽象层 (HAL) 中所定义。您可以将这些值与设备的当前状态或一组预期值进行比较,以验证密钥对是否仍然有效,可用于您的应用。

每个字段名称对应于 Keymaster / KeyMint 授权标记中具有相同名称的标记。例如,授权列表中的 keySize 字段对应于 Tag::KEY_SIZE 授权标记。

AIDL 接口规范 包含有关授权标记的权威信息。这定义了每个标记的 ID 值和类型,并还指示每个标记是否预计存在于 hardwareEnforced 授权列表中(表明该标记在安全环境中强制执行),或存在于 softwareEnforced 授权列表中(表明该标记由 Android 强制执行,通常由 Keystore 强制执行)。

以下列表中的每个字段都是可选的

purpose
对应于 Tag::PURPOSE 授权标签,该标签使用标签 ID 值 1。
算法

对应于 Tag::ALGORITHM 授权标签,该标签使用标签 ID 值 2。

在证明 AuthorizationList 对象中,算法值始终为 RSAEC

密钥大小
对应于 Tag::KEY_SIZE 授权标签,该标签使用标签 ID 值 3。
摘要
对应于 Tag::DIGEST 授权标签,该标签使用标签 ID 值 5。
填充
对应于 Tag::PADDING 授权标签,该标签使用标签 ID 值 6。
椭圆曲线

对应于 Tag::EC_CURVE 授权标签,该标签使用标签 ID 值 10。

用于生成椭圆曲线 (EC) 密钥对的参数集,该密钥对在 Android 系统密钥库中使用 ECDSA 进行签名和验证。

RSA 公钥指数
对应于 Tag::RSA_PUBLIC_EXPONENT 授权标签,该标签使用标签 ID 值 200。
掩码生成函数摘要

仅在密钥证明版本 >= 100 中存在。

对应于 Tag::RSA_OAEP_MGF_DIGEST KeyMint 授权标签,该标签使用标签 ID 值 203。
回滚抵抗

仅在密钥证明版本 >= 3 中存在。

对应于 Tag::ROLLBACK_RESISTANT 授权标签,该标签使用标签 ID 值 303。

仅限早期启动

仅在密钥证明版本 >= 4 中存在。

对应于 Tag::EARLY_BOOT_ONLY 授权标签,该标签使用标签 ID 值 305。

活动日期时间
对应于 Tag::ACTIVE_DATETIME 授权标签,该标签使用标签 ID 值 400。
起源过期日期时间
对应于 Tag::ORIGINATION_EXPIRE_DATETIME Keymaster 授权标签,该标签使用标签 ID 值 401。
使用过期日期时间
对应于 Tag::USAGE_EXPIRE_DATETIME 授权标签,该标签使用标签 ID 值 402。
使用次数限制
对应于 Tag::USAGE_COUNT_LIMIT 授权标签,该标签使用标签 ID 值 405。
无需验证

对应于 Tag::NO_AUTH_REQUIRED 授权标签,该标签使用标签 ID 值 503。

用户验证类型
对应于 Tag::USER_AUTH_TYPE 授权标签,该标签使用标签 ID 值 504。
验证超时
对应于 Tag::AUTH_TIMEOUT 授权标签,该标签使用标签 ID 值 505。
允许随身携带

对应于 Tag::ALLOW_WHILE_ON_BODY 授权标签,该标签使用标签 ID 值 506。

允许在用户仍佩戴设备的情况下,即使密钥的验证超时时间已过,也能使用密钥。请注意,安全的随身传感器会确定设备是否佩戴在用户身上。

要求可信用户在场

仅在密钥证明版本 >= 3 中存在。

对应于 Tag::TRUSTED_USER_PRESENCE_REQUIRED 授权标签,该标签使用标签 ID 值 507。

指定该密钥仅在用户提供其物理存在的证明时才可以使用。以下是一些示例:

  • 对于 StrongBox 密钥,一个连接到 StrongBox 设备引脚的硬件按钮。
  • 对于 TEE 密钥,只要 TEE 独占控制扫描仪并执行指纹匹配过程,指纹验证就提供了在场证明。
要求可信确认

仅在密钥证明版本 >= 3 中存在。

对应于 Tag::TRUSTED_CONFIRMATION_REQUIRED 授权标签,该标签使用标签 ID 值 508。

指定密钥仅在用户使用批准令牌确认要签名的数据时才可以使用。有关如何获取用户确认的更多信息,请参阅 Android 受保护的确认

注意:此标签仅适用于使用 SIGN 目的的密钥。

要求解锁设备

仅在密钥证明版本 >= 3 中存在。

对应于 Tag::UNLOCKED_DEVICE_REQUIRED 授权标签,该标签使用标签 ID 值 509。

所有应用程序

对应于 Tag::ALL_APPLICATIONS 授权标签,该标签使用标签 ID 值 600。

指示设备上的所有应用是否可以访问密钥对。

应用程序 ID
对应于 Tag::APPLICATION_ID 授权标签,该标签使用标签 ID 值 601。
创建时间
对应于 Tag::CREATION_DATETIME 授权标签,该标签使用标签 ID 值 701。
起源

对应于 Tag::ORIGIN 授权标签,该标签使用标签 ID 值 702。

回滚抵抗

仅在密钥证明版本 1 和 2 中存在。

对应于 Tag::ROLLBACK_RESISTANT 授权标签,该标签使用标签 ID 值 703。

信任根

对应于 Tag::ROOT_OF_TRUST 授权标签,该标签使用标签 ID 值 704。

有关更多详细信息,请参阅描述 RootOfTrust 数据结构的部分。

操作系统版本

对应于 Tag::OS_VERSION 授权标签,该标签使用标签 ID 值 705。

与 Keymaster 关联的 Android 操作系统版本,指定为六位数字。例如,版本 8.1.0 表示为 080100。

只有 Keymaster 版本 1.0 或更高版本在授权列表中包含此值。

操作系统补丁级别

对应于 Tag::PATCHLEVEL 授权标签,该标签使用标签 ID 值 706。

与 Keymaster 中使用的安全补丁关联的月份和年份,指定为六位数字。例如,2018 年 8 月的补丁表示为 201808。

只有 Keymaster 版本 1.0 或更高版本在授权列表中包含此值。

证明应用程序 ID

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_APPLICATION_ID Keymaster 授权标签,该标签使用标签 ID 值 709。

有关更多详细信息,请参阅描述 AttestationApplicationId 数据结构的部分。

证明 ID 品牌

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_ID_BRAND Keymaster 标签,该标签使用标签 ID 值 710。

证明 ID 设备

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_ID_DEVICE Keymaster 标签,该标签使用标签 ID 值 711。

证明 ID 产品

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_ID_PRODUCT Keymaster 标签,该标签使用标签 ID 值 712。

证明 ID 序列号

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_ID_SERIAL Keymaster 标签,该标签使用标签 ID 值 713。

证明 ID IMEI

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_ID_IMEI 授权标签,该标签使用标签 ID 值 714。

证明 ID MEID

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_ID_MEID 授权标签,该标签使用标签 ID 值 715。

证明 ID 制造商

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_ID_MANUFACTURER 授权标签,该标签使用标签 ID 值 716。

证明 ID 型号

仅在密钥证明版本 >= 2 中存在。

对应于 Tag::ATTESTATION_ID_MODEL 授权标签,该标签使用标签 ID 值 717。

供应商补丁级别

仅在密钥证明版本 >= 3 中存在。

对应于 Tag::VENDOR_PATCHLEVEL 授权标签,该标签使用标签 ID 值 718。

指定要使用此密钥,设备上必须安装的供应商映像安全补丁级别。该值以 YYYYMMDD 的形式出现,表示供应商安全补丁的日期。例如,如果在安装了供应商的 2018 年 8 月 1 日安全补丁的 Android 设备上生成密钥,则此值将为 20180801。

启动补丁级别

仅在密钥证明版本 >= 3 中存在。

对应于 Tag::BOOT_PATCHLEVEL 授权标签,该标签使用标签 ID 值 719。

指定要使用此密钥,设备上必须安装的内核映像安全补丁级别。该值以 YYYYMMDD 的形式出现,表示系统安全补丁的日期。例如,如果在安装了系统的 2018 年 8 月 5 日安全补丁的 Android 设备上生成密钥,则此值将为 20180805。

设备唯一证明

仅在密钥证明版本 >= 4 中存在。

对应于 Tag::DEVICE_UNIQUE_ATTESTATION 授权标签,该标签使用标签 ID 值 720。

证明 ID 第二个 IMEI

仅在密钥证明版本 >= 300 中存在。

对应于 Tag::ATTESTATION_ID_SECOND_IMEI 授权标签,该标签使用标签 ID 值 723。

信任根

此值集合定义了有关设备状态的关键信息。

以下列表中的每个字段都是必需的

已验证启动密钥

验证系统映像的密钥的 安全哈希。建议您为此哈希使用 SHA-256 算法。

设备已锁定
如果设备的引导加载程序已锁定,则为真,这将启用已验证启动检查并防止将未签名的设备映像刷入设备。有关此功能的更多信息,请参阅 验证启动 文档。
已验证启动状态
根据已验证启动功能,设备的 启动状态
已验证启动哈希

仅在密钥证明版本 >= 3 中存在。

由已验证启动保护的所有数据的摘要。对于使用已验证启动的 Android 已验证启动实现的设备,此值包含VBMeta 结构或已验证启动元数据结构的摘要。

要了解有关如何计算此值的更多信息,请参阅 VBMeta 摘要

已验证启动状态

此数据结构提供设备的当前启动状态,该状态表示设备完成启动后提供给用户和应用的保护级别。有关此功能的更多信息,请参阅验证启动文档中的 启动状态 部分。

此数据结构是枚举,因此它恰好采用以下值之一

已验证

表示完整的信任链,包括引导加载程序、启动分区和所有已验证分区。

当设备处于此启动状态时,verifiedBootKey 是设备嵌入式证书的哈希值,该证书由设备制造商在出厂时添加到设备的 ROM 中。

自签名

表示设备嵌入式证书已验证设备的启动分区,并且签名有效。

当设备处于此启动状态时,verifiedBootKey 是用户安装的证书的哈希值,该证书对用户添加到设备的启动分区(代替原始制造商提供的启动分区)进行签名。

未验证
表示用户可以自由修改设备。因此,用户负责验证设备的完整性。
失败
表示设备验证失败。证明证书不应将此值用于 VerifiedBootState

证明应用程序 ID

此数据结构反映了 Android 平台对哪些应用程序可以利用证明下的密钥材料的判断。该 ID 可以包含多个包,当且仅当多个包共享相同的 UID 时。八位字节字符串本身根据以下 ASN.1 模式进行格式化

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
包信息
一组 AttestationPackageInfo 对象,每个对象提供一个包的名称和版本号。
签名摘要

一组应用程序签名证书的 SHA-256 摘要。一个应用程序可以有多个签名密钥证书链。对于每个链,都会对“叶”证书进行摘要处理,并将摘要放置在 signature_digests 字段中。字段名称具有误导性,因为摘要数据是应用程序的签名证书,而不是应用程序签名,因为它以 Signature 类命名,该类由调用 getPackageInfo() 返回。以下代码片段显示了一个示例集

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}

预配信息扩展数据模式

预配信息扩展的 OID 为 1.3.6.1.4.1.11129.2.1.30。该扩展提供预配服务器了解的有关设备的信息。此扩展遵循 CDDL 模式。

  {
        1 : int,   ; certificates issued
  }

该映射未版本化,并且可能会添加新的可选字段。

已颁发的证书

过去 30 天内向设备颁发的证书的大致数量。如果该值比平均值大几个数量级,则可以将其用作潜在滥用的信号。