Проверка пар аппаратных ключей с помощью аттестации ключей

Аттестация ключей дает вам больше уверенности в том, что ключи, которые вы используете в своем приложении, хранятся в аппаратном хранилище ключей устройства. В следующих разделах описывается, как проверить свойства аппаратных ключей и как интерпретировать данные расширения сертификатов аттестации.

Примечание. Прежде чем проверять свойства аппаратных ключей устройства в среде производственного уровня, убедитесь, что устройство поддерживает аттестацию ключей на аппаратном уровне. Для этого убедитесь, что цепочка сертификатов аттестации содержит корневой сертификат, подписанный корневым ключом аттестации Google, и что для элемента attestationSecurityLevel в структуре данных описания ключа установлен уровень безопасности TrustedEnvironment или уровень безопасности StrongBox .

Кроме того, важно проверить подписи в цепочке сертификатов и убедиться, что ни один из ключей в цепочке не был отозван, проверив список статусов отзыва сертификатов . Если все они действительны и корневой ключ не является корневым ключом Google, не доверяйте полностью аттестации. Однако обратите внимание, что устройства, содержащие отозванные сертификаты, по крайней мере, заслуживают такого же доверия, как и устройства, которые поддерживают только аттестацию программного обеспечения. Наличие полностью действительной аттестации является сильным положительным показателем. Отсутствие такового является нейтральным, а не отрицательным показателем.

Получение и проверка пары аппаратных ключей

Во время аттестации ключей вы указываете псевдоним пары ключей и получаете ее цепочку сертификатов, которую можно использовать для проверки свойств этой пары ключей.

Если устройство поддерживает аттестацию ключей на аппаратном уровне, корневой сертификат в этой цепочке подписывается с использованием корневого ключа аттестации, который безопасно предоставляется в аппаратное хранилище ключей устройства.

Примечание. На устройствах, которые поставляются с аттестацией ключа на аппаратном уровне, Android 7.0 (уровень API 24) или выше и службами Google Play, корневой сертификат подписывается корневым ключом аттестации Google. Убедитесь, что этот корневой сертификат входит в число перечисленных в разделе о корневых сертификатах .

Чтобы реализовать аттестацию ключей, выполните следующие действия:

  1. Используйте метод getCertificateChain() объекта KeyStore , чтобы получить ссылку на цепочку сертификатов X.509, связанных с аппаратным хранилищем ключей.
  2. Отправьте сертификаты на отдельный сервер, которому вы доверяете, для проверки.

    Внимание: не выполняйте следующий процесс проверки на том же устройстве, что и хранилище ключей. Если система Android на этом устройстве взломана, это может привести к тому, что процесс проверки будет доверять чему-то ненадежному.

  3. Получите ссылку на библиотеку анализа и проверки цепочки сертификатов X.509, которая наиболее подходит для вашего набора инструментов. Убедитесь, что корневой общедоступный сертификат заслуживает доверия и что каждый сертификат подписывает следующий сертификат в цепочке.

  4. Проверьте статус отзыва каждого сертификата, чтобы убедиться, что ни один из сертификатов не был отозван.

  5. При необходимости проверьте расширение сертификата с информацией об обеспечении, которое присутствует только в новых цепочках сертификатов.

    Получите ссылку на библиотеку анализатора CBOR, которая наиболее подходит для вашего набора инструментов. Найдите ближайший к корню сертификат, содержащий расширение сертификата с информацией об обеспечении . Используйте анализатор для извлечения данных расширения сертификата с информацией об обеспечении из этого сертификата.

    Дополнительные сведения см. в разделе о схеме данных расширения информации обеспечения .

  6. Получите ссылку на библиотеку анализатора ASN.1, которая наиболее подходит для вашего набора инструментов. Найдите ближайший к корню сертификат, содержащий расширение сертификата аттестации ключа . Если расширение сертификата информации обеспечения присутствовало, расширение сертификата аттестации ключа должно находиться в следующем за ним сертификате. Используйте анализатор для извлечения данных расширения сертификата аттестации ключа из этого сертификата.

    Внимание: не предполагайте, что расширение сертификата аттестации ключа находится в конечном сертификате цепочки. Доверять можно только первому появлению расширения в цепочке. Любые дальнейшие экземпляры расширения не были выпущены защищенным оборудованием и могли быть выпущены злоумышленником, расширяющим цепочку при попытке создать поддельные аттестации для ненадежных ключей.

    В образце Key Attestation используется анализатор ASN.1 из Bouncy Castle для извлечения данных расширения сертификата аттестации. Вы можете использовать этот пример как справочник для создания собственного синтаксического анализатора.

    Дополнительные сведения см. в разделе о схеме данных расширения аттестации ключей .

  7. Проверьте данные расширения, полученные на предыдущих шагах, на предмет согласованности и сравните их с набором значений, которые, как вы ожидаете, будет содержать ключ с аппаратной поддержкой.

Корневые сертификаты

Надежность аттестации зависит от корневого сертификата цепочки. Устройства Android, прошедшие тестирование, необходимое для установки набора приложений Google, включая Google Play, и запущенные с 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-----
  

Если корневой сертификат в полученной вами цепочке аттестаций содержит этот открытый ключ и ни один из сертификатов в цепочке не был отозван , вы знаете, что:

  1. Ваш ключ находится в оборудовании, которое Google считает безопасным; и
  2. Он обладает свойствами, описанными в сертификате аттестации.

Если в цепочке аттестации есть какой-либо другой корневой открытый ключ, Google не делает никаких заявлений о безопасности оборудования. Это не означает, что ваш ключ скомпрометирован, просто аттестация не доказывает, что ключ находится на защищенном оборудовании. Соответственно скорректируйте свои предположения о безопасности.

Если корневой сертификат не содержит открытого ключа на этой странице, есть две вероятные причины:

  • Скорее всего, устройство выпущено с версией Android ниже 7.0 и не поддерживает аттестацию оборудования. В этом случае в Android имеется программная реализация аттестации, которая создает такой же сертификат аттестации, но подписанный ключом , жестко запрограммированным в исходном коде Android . Поскольку этот ключ подписи не является секретом, аттестация могла быть создана злоумышленником, претендующим на предоставление безопасного оборудования.
  • Другая вероятная причина заключается в том, что устройство не является устройством Google Play. В этом случае производитель устройства может свободно создать свой собственный корень и делать любые заявления о том, что означает аттестация. Обратитесь к документации производителя устройства. Обратите внимание, что на момент написания этой статьи Google не знает ни одного производителя устройств, который сделал это.

Список статусов отзыва сертификатов

Ключи аттестации могут быть отозваны по ряду причин, включая неправильное обращение или подозрение на их извлечение злоумышленником. Поэтому крайне важно, чтобы статус каждого сертификата в цепочке аттестации проверялся по официальному списку статусов отзыва сертификатов (CRL). Этот список поддерживается Google и публикуется по адресу: https://android.googleapis.com/attestation/status . Заголовок Cache-Control в ответе HTTP определяет, как часто проверять наличие обновлений, чтобы для каждого проверяемого сертификата не требовался сетевой запрос. Этот 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
}

Пример списка отзыва сертификатов:

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

Устаревшие списки отзыва сертификатов

URL-адреса CRL, встроенные в устаревшие сертификаты аттестации, продолжают работать. Новые сертификаты аттестации больше не содержат расширение URL-адреса CRL. Статус устаревших сертификатов также включен в список статусов аттестации, поэтому разработчики могут безопасно переключаться на использование списка статусов аттестации как для новых, так и для устаревших сертификатов. Пример того, как правильно проверить ключи аттестации Android, включен в пример Key Attestation .

Схема данных расширения ключевой аттестации

Расширение аттестации ключа имеет 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),
}

В следующем списке представлено описание каждого элемента схемы:

КлючОписание

Эта последовательность значений представляет общую информацию о паре ключей, проверяемой посредством аттестации ключей, и обеспечивает легкий доступ к дополнительным сведениям.

attestationVersion
Версия функции ключевой аттестации.
Ценить Версия
1 Ключевой мастер версии 2.0
2 Ключевой мастер версии 3.0
3 Ключевой мастер версии 4.0
4 Ключевой мастер версии 4.1
100 КейМинт версия 1.0
200 КейМинт версии 2.0
300 КейМинт версии 3.0
attestationSecurityLevel

Уровень безопасности аттестации.

Предупреждение. Несмотря на то, что можно подтвердить ключи, хранящиеся в системе Android (то есть, если для параметра attestationSecurityLevel установлено значение Software), вы не можете доверять этим подтверждениям, если система Android окажется скомпрометированной.

keymasterVersion / keyMintVersion
Версия уровня аппаратной абстракции (HAL) Keymaster или KeyMint.
Ценить Версия
0 Keymaster версии 0.2 или 0.3
1 Ключевой мастер версии 1.0
2 Ключевой мастер версии 2.0
3 Ключевой мастер версии 3.0
4 Ключевой мастер версии 4.0
41 Ключевой мастер версии 4.1
100 КейМинт версия 1.0
200 КейМинт версии 2.0
300 КейМинт версии 3.0
keymasterSecurityLevel / keyMintSecurityLevel
Уровень безопасности реализации Keymaster/KeyMint.
attestationChallenge
Содержит задачу, заданную во время создания ключа. Проверьте, соответствует ли это значение значению, предоставленному вашим сервером и хранящемуся в теге авторизации Tag::ATTESTATION_CHALLENGE . В противном случае ваша служба может быть уязвима для повторного воспроизведения старых сертификатов аттестации.
uniqueId
Это значение идентифицирует устройство, но только в течение ограниченного периода времени. Он вычисляется и используется только системными приложениями. Во всех остальных приложениях uniqueId пуст.
softwareEnforced
Необязательный. Список авторизации Keymaster/KeyMint, который применяется системой Android, а не доверенной средой выполнения (TEE) устройства. Информация в этом списке авторизации собирается или генерируется кодом, который является частью платформы и хранится в системном разделе устройства. Содержимому этого списка авторизации можно доверять, если на устройстве установлена ​​операционная система, совместимая с моделью безопасности платформы Android. Все сертифицированные устройства Android соответствуют этой модели безопасности, поэтому, если устройство заблокировано и проверенное состояние загрузки — Verified , значения здесь должны быть надежными. На модифицированном устройстве, где загрузчик разблокирован, пользователь может установить операционную систему, не соответствующую модели безопасности платформы Android, поэтому значения в этом поле могут быть выбраны пользователем произвольно.
hardwareEnforced
Необязательный. Список авторизации Keymaster/KeyMint, который обеспечивается доверенной средой выполнения устройства (TEE). Информация в этом списке авторизации собирается или генерируется кодом, который является частью защищенного оборудования и не контролируется платформой. Например, информация в этом списке авторизации поступает из загрузчика устройства или TEE, работающего на устройстве. Поля в этом списке авторизации, которые не заданы напрямую KeyMint, предоставляются другими частями защищенного оборудования (например, загрузчиком) через безопасные каналы связи, которые не предполагают доверия к платформе. Разница между защищенным оборудованием и системой Android заключается в том, что пользователь не может изменять код, работающий на защищенном оборудовании (прошивке), поэтому он не может изменить значения в этом списке авторизации.

Уровень безопасности

Эта структура данных указывает степень защиты функции программного обеспечения, например пары ключей, в зависимости от ее местоположения внутри устройства.

Поскольку структура данных является перечислением, она принимает ровно одно из следующих значений:

хранилище ключей
Логика создания и управления функцией реализована в системе Android. Для создания и хранения пар ключей это место менее безопасно, чем TEE, но более безопасно, чем пространство процесса вашего приложения.
Доверенная среда
Логика создания функции и управления ею реализована в защищенном оборудовании, таком как TEE. С точки зрения создания и хранения пар ключей это место более безопасно, поскольку защищенное оборудование обладает высокой устойчивостью к удаленному компрометации.
Сейф
Логика создания и управления функцией реализована в специальном аппаратном модуле безопасности . С точки зрения создания и хранения пар ключей это место более безопасно, поскольку оно устойчиво к удаленному взлому и аппаратным атакам на модуль.
Программное обеспечение
Логика создания и управления этой функцией реализована в реализации KeyMint или Keymaster, которая не работает в безопасной среде. Для создания и хранения пар ключей это место менее безопасно, чем TEE, но более безопасно, чем пространство процесса вашего приложения.

Список авторизации

Эта структура данных содержит сами свойства пары ключей, определенные на уровне аппаратной абстракции (HAL) Keymaster или KeyMint. Вы сравниваете эти значения с текущим состоянием устройства или с набором ожидаемых значений, чтобы убедиться, что пара ключей по-прежнему действительна для использования в вашем приложении.

Каждое имя поля соответствует одноименному тегу авторизации Keymaster/KeyMint. Например, поле keySize в списке авторизации соответствует тегу авторизации Tag::KEY_SIZE .

Спецификация интерфейса AIDL содержит исчерпывающую информацию о тегах авторизации. Это определяет значение идентификатора и тип каждого тега, а также указывает, будет ли каждый тег присутствовать в списке авторизации hardwareEnforced (указывая, что тег применяется в безопасной среде) или в списке авторизации softwareEnforced (указывая, что тег применяется Android, обычно Keystore).

Каждое поле в следующем списке является необязательным:

purpose
Соответствует тегу авторизации Tag::PURPOSE , который использует значение идентификатора тега, равное 1.
algorithm

Соответствует тегу авторизации Tag::ALGORITHM , который использует значение идентификатора тега 2.

В объекте AuthorizationList аттестации значением алгоритма всегда является RSA или EC .

keySize
Соответствует тегу авторизации Tag::KEY_SIZE , который использует значение идентификатора тега 3.
digest
Соответствует тегу авторизации Tag::DIGEST , который использует значение идентификатора тега, равное 5.
padding
Соответствует тегу авторизации Tag::PADDING , который использует значение идентификатора тега 6.
ecCurve

Соответствует тегу авторизации Tag::EC_CURVE , который использует значение идентификатора тега 10.

Набор параметров, используемых для создания пары ключей эллиптической кривой (EC), которая использует ECDSA для подписи и проверки, в хранилище ключей системы Android.

rsaPublicExponent
Соответствует тегу авторизации Tag::RSA_PUBLIC_EXPONENT , который использует значение идентификатора тега 200.
mgfDigest

Присутствует только в версии аттестации ключа >= 100.

Соответствует тегу авторизации Tag::RSA_OAEP_MGF_DIGEST KeyMint, который использует значение идентификатора тега 203.
rollbackResistance

Присутствует только в версии аттестации ключа >= 3.

Соответствует тегу авторизации Tag::ROLLBACK_RESISTANT , который использует значение идентификатора тега 303.

earlyBootOnly

Присутствует только в версии аттестации ключа >= 4.

Соответствует тегу авторизации Tag::EARLY_BOOT_ONLY , который использует значение идентификатора тега 305.

activeDateTime
Соответствует тегу авторизации Tag::ACTIVE_DATETIME , который использует значение идентификатора тега 400.
originationExpireDateTime
Соответствует тегу авторизации Tag::ORIGINATION_EXPIRE_DATETIME Keymaster, который использует значение идентификатора тега 401.
usageExpireDateTime
Соответствует тегу авторизации Tag::USAGE_EXPIRE_DATETIME , который использует значение идентификатора тега 402.
usageCountLimit
Соответствует тегу авторизации Tag::USAGE_COUNT_LIMIT , который использует значение идентификатора тега 405.
noAuthRequired

Соответствует тегу авторизации Tag::NO_AUTH_REQUIRED , который использует значение идентификатора тега 503.

userAuthType
Соответствует тегу авторизации Tag::USER_AUTH_TYPE , который использует значение идентификатора тега 504.
authTimeout
Соответствует тегу авторизации Tag::AUTH_TIMEOUT , который использует значение идентификатора тега 505.
allowWhileOnBody

Соответствует тегу авторизации Tag::ALLOW_WHILE_ON_BODY , который использует значение идентификатора тега 506.

Позволяет использовать ключ по истечении времени ожидания аутентификации, если пользователь все еще носит устройство на своем теле. Обратите внимание, что безопасный датчик на теле определяет, носит ли устройство на теле пользователя.

trustedUserPresenceRequired

Присутствует только в версии аттестации ключа >= 3.

Соответствует тегу авторизации Tag::TRUSTED_USER_PRESENCE_REQUIRED , который использует значение идентификатора тега 507.

Указывает, что этот ключ можно использовать только в том случае, если пользователь предоставил доказательство физического присутствия. Несколько примеров включают следующее:

  • Для ключа StrongBox — аппаратная кнопка, жестко подключенная к контакту на устройстве StrongBox.
  • Для ключа TEE аутентификация по отпечатку пальца обеспечивает доказательство присутствия, пока TEE имеет исключительный контроль над сканером и выполняет процесс сопоставления отпечатков пальцев.
trustedConfirmationRequired

Присутствует только в версии аттестации ключа >= 3.

Соответствует тегу авторизации Tag::TRUSTED_CONFIRMATION_REQUIRED , который использует значение идентификатора тега 508.

Указывает, что ключ можно использовать только в том случае, если пользователь предоставляет подтверждение подписываемых данных с помощью токена утверждения. Дополнительные сведения о том, как получить подтверждение пользователя, см. в разделе Android Protected Confirmation .

Примечание. Этот тег применим только к клавишам, которые используют функцию SIGN .

unlockedDeviceRequired

Присутствует только в версии аттестации ключа >= 3.

Соответствует тегу авторизации Tag::UNLOCKED_DEVICE_REQUIRED , который использует значение идентификатора тега 509.

allApplications

Соответствует тегу авторизации Tag::ALL_APPLICATIONS , который использует значение идентификатора тега 600.

Указывает, могут ли все приложения на устройстве получить доступ к паре ключей.

applicationId
Соответствует тегу авторизации Tag::APPLICATION_ID , который использует значение идентификатора тега 601.
creationDateTime
Соответствует тегу авторизации Tag::CREATION_DATETIME , который использует значение идентификатора тега 701.
origin

Соответствует тегу авторизации Tag::ORIGIN , который использует значение идентификатора тега 702.

rollbackResistant

Присутствует только в версиях 1 и 2 аттестации ключей.

Соответствует тегу авторизации Tag::ROLLBACK_RESISTANT , который использует значение идентификатора тега 703.

rootOfTrust

Соответствует тегу авторизации Tag::ROOT_OF_TRUST , который использует значение идентификатора тега 704.

Подробнее см. в разделе, описывающем структуру данных RootOfTrust .

osVersion

Соответствует тегу авторизации Tag::OS_VERSION , который использует значение идентификатора тега 705.

Версия операционной системы Android, связанная с Keymaster, в виде шестизначного целого числа. Например, версия 8.1.0 представлена ​​как 080100.

Только Keymaster версии 1.0 или выше включает это значение в список авторизации.

osPatchLevel

Соответствует тегу авторизации Tag::PATCHLEVEL , который использует значение идентификатора тега 706.

Месяц и год, связанные с исправлением безопасности, которое используется в Keymaster, в виде шестизначного целого числа. Например, патч от августа 2018 года представлен как 201808.

Только Keymaster версии 1.0 или выше включает это значение в список авторизации.

attestationApplicationId

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_APPLICATION_ID Keymaster, который использует значение идентификатора тега 709.

Дополнительные сведения см. в разделе, описывающем структуру данных AttestationApplicationId .

attestationIdBrand

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу Tag::ATTESTATION_ID_BRAND Keymaster, который использует значение идентификатора тега 710.

attestationIdDevice

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу Tag::ATTESTATION_ID_DEVICE Keymaster, который использует значение идентификатора тега 711.

attestationIdProduct

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу Tag::ATTESTATION_ID_PRODUCT Keymaster, который использует значение идентификатора тега 712.

attestationIdSerial

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу Tag::ATTESTATION_ID_SERIAL Keymaster, который использует значение идентификатора тега 713.

attestationIdImei

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_IMEI , который использует значение идентификатора тега 714.

attestationIdMeid

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_MEID , который использует значение идентификатора тега 715.

attestationIdManufacturer

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_MANUFACTURER , который использует значение идентификатора тега 716.

attestationIdModel

Присутствует только в версиях ключевой аттестации >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_MODEL , который использует значение идентификатора тега 717.

vendorPatchLevel

Присутствует только в версиях ключевой аттестации >= 3.

Соответствует тегу авторизации Tag::VENDOR_PATCHLEVEL , который использует значение идентификатора тега 718.

Указывает уровень исправления безопасности образа поставщика , который должен быть установлен на устройстве, чтобы можно было использовать этот ключ. Значение отображается в формате ГГГГММДД, что соответствует дате обновления безопасности поставщика. Например, если ключ был создан на устройстве Android с установленным исправлением безопасности от 1 августа 2018 года, это значение будет 20180801.

bootPatchLevel

Присутствует только в версиях ключевой аттестации >= 3.

Соответствует тегу авторизации Tag::BOOT_PATCHLEVEL , который использует значение идентификатора тега 719.

Указывает уровень исправления безопасности образа ядра , который должен быть установлен на устройстве, чтобы можно было использовать этот ключ. Значение отображается в формате ГГГГММДД, что соответствует дате обновления системы безопасности. Например, если ключ был сгенерирован на устройстве Android с установленным исправлением безопасности системы от 5 августа 2018 года, это значение будет 20180805.

deviceUniqueAttestation

Присутствует только в версиях ключевой аттестации >= 4.

Соответствует тегу авторизации Tag::DEVICE_UNIQUE_ATTESTATION , который использует значение идентификатора тега 720.

attestationIdSecondImei

Присутствует только в версиях ключевой аттестации >= 300.

Соответствует тегу авторизации Tag::ATTESTATION_ID_SECOND_IMEI , который использует значение идентификатора тега 723.

РутОфТраст

Этот набор значений определяет ключевую информацию о состоянии устройства.

Каждое поле в следующем списке является обязательным:

verifiedBootKey

Безопасный хэш ключа, который проверяет образ системы. Для этого хеша рекомендуется использовать алгоритм SHA-256.

deviceLocked
True, если загрузчик устройства заблокирован, что позволяет проверять проверенную загрузку и предотвращает установку на устройство неподписанного образа устройства. Дополнительные сведения об этой функции см. в документации по проверке загрузки .
verifiedBootState
Состояние загрузки устройства в соответствии с функцией проверенной загрузки.
verifiedBootHash

Присутствует только в версиях ключевой аттестации >= 3.

Дайджест всех данных, защищенных проверенной загрузкой. Для устройств, использующих реализацию Verified Boot Android Verified Boot, это значение содержит дайджест структуры VBMeta или структуру метаданных Verified Boot.

Чтобы узнать больше о том, как вычислить это значение, см. The VBMeta Digest .

ПровереноBootState

Эта структура данных предоставляет текущее состояние загрузки устройства, которое представляет уровень защиты, предоставляемой пользователю и приложениям после завершения загрузки устройства. Дополнительные сведения об этой функции см. в разделе «Состояние загрузки» документации «Проверка загрузки».

Эта структура данных является перечислением, поэтому она принимает ровно одно из следующих значений:

Проверено

Указывает полную цепочку доверия, включающую загрузчик, загрузочный раздел и все проверенные разделы.

Когда устройство находится в этом состоянии загрузки, verifiedBootKey — это хеш встроенного в устройство сертификата, который производитель устройства добавляет в ПЗУ устройства на заводе.

Самоподписанный

Указывает, что встроенный в устройство сертификат подтвердил загрузочный раздел устройства и что подпись действительна.

Когда устройство находится в этом состоянии загрузки, verifiedBootKey представляет собой хеш установленного пользователем сертификата, который подписывает загрузочный раздел, который пользователь добавляет на устройство вместо исходного загрузочного раздела, предоставленного производителем.

Непроверенный
Указывает, что пользователь может свободно модифицировать устройство. Таким образом, пользователь несет ответственность за проверку целостности устройства.
Неуспешный
Указывает, что устройство не прошло проверку. Сертификат аттестации никогда не должен использовать это значение для VerifiedBootState .

Идентификатор приложения аттестации

Эта структура данных отражает мнение платформы Android относительно того, каким приложениям разрешено использовать аттестуемый секретный ключ. Идентификатор может содержать несколько пакетов тогда и только тогда, когда несколько пакетов имеют один и тот же UID. Сама строка октетов форматируется в соответствии со следующей схемой 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 , каждый из которых предоставляет имя пакета и номер версии.
подпись_дайджесты

Набор дайджестов 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
  }

Карта не версионирована, и могут быть добавлены новые необязательные поля.

certs_issued

Примерное количество сертификатов, выданных устройству за последние 30 дней. Это значение можно использовать как сигнал о потенциальном злоупотреблении, если оно на несколько порядков превышает среднее значение.