Sprawdzaj pary kluczy wspieranych sprzętowo za pomocą atestu kluczy

Atestacja kluczy daje większą pewność, że klucze, których używasz w aplikacji, są przechowywane w sprzętowym magazynie kluczy urządzenia. W tych sekcjach opisano, jak weryfikować właściwości kluczy opartych na sprzęcie oraz interpretować dane rozszerzeń certyfikatów poświadczenia.

Uwaga: zanim zweryfikujesz właściwości kluczy sprzętowych urządzenia w środowisku produkcyjnym, upewnij się, że urządzenie obsługuje uwierzytelnianie klucza na poziomie sprzętu. W tym celu sprawdź, czy łańcuch certyfikatu weryfikacji zawiera certyfikat główny podpisany kluczem głównym weryfikacji Google, a element attestationSecurityLevel w strukturze danych opis klucza ma ustawiony poziom zabezpieczeń TrustedEnvironment lub StrongBox.

Ponadto ważne jest, aby zweryfikować podpisy w łańcuchu certyfikatów i sprawdzić, czy żaden z kluczy w łańcuchu nie został cofnięty. Aby to zrobić, skorzystaj z listy stanu cofnięcia certyfikatu. Nie ufaj atestowi w pełni, chyba że wszystkie są prawidłowe, a głównym kluczem Google jest klucz główny Google. Pamiętaj jednak, że urządzenia z wycofanymi certyfikatami są równie godne zaufania co urządzenia, które obsługują tylko uwierzytelnianie oprogramowania. Posiadanie ważnego certyfikatu jest bardzo pozytywnym sygnałem. Brak takiego dokumentu jest neutralnym, a nie negatywnym wskaźnikiem.

Pobieranie i weryfikowanie pary kluczy obsługiwanych sprzętowo

Podczas atestacji klucza podajesz alias pary kluczy i pobierasz jej łańcuch certyfikatów, którego możesz użyć do weryfikacji właściwości tej pary kluczy.

Jeśli urządzenie obsługuje atestację kluczy na poziomie sprzętowym, certyfikat główny w tym łańcuchu jest podpisany za pomocą klucza głównego atestu, który jest bezpiecznie udostępniany w sprzętowym magazynie kluczy urządzenia.

Uwaga: na urządzeniach z systemem poświadczania kluczy na poziomie sprzętowym, z Androidem 7.0 (poziom interfejsu API 24) lub nowszym oraz Usługami Google Play certyfikat główny jest podpisany za pomocą głównego klucza atestu Google. Sprawdź, czy ten certyfikat główny znajduje się na liście certyfikatów głównych.

Aby wdrożyć atestację klucza, wykonaj te czynności:

  1. Użyj metody getCertificateChain() obiektu KeyStore, aby uzyskać odwołanie do łańcucha certyfikatów X.509 powiązanych ze sprzętowym magazynem kluczy.
  2. Prześlij certyfikaty na oddzielny serwer, któremu ufasz, w celu ich zweryfikowania.

    Uwaga: nie przeprowadzaj tego procesu weryfikacji na tym samym urządzeniu, na którym znajduje się KeyStore. Jeśli system Android na tym urządzeniu zostanie zhakowany, podczas procesu weryfikacji może zaufać niewiarygodnemu systemowi.

  3. Uzyskaj odwołanie do biblioteki analizy i weryfikacji łańcucha certyfikatów X.509, która jest najbardziej odpowiednia dla Twojego zbioru narzędzi. Sprawdź, czy certyfikat publiczny wierzchołka jest wiarygodny i czy każdy certyfikat podpisuje następny certyfikat w łańcuchu.

  4. Sprawdź stan unieważnienia każdego certyfikatu, aby upewnić się, że żaden z nich nie został unieważniony.

  5. Opcjonalnie sprawdź rozszerzenie certyfikatu informacji o zarządzaniu, które występuje tylko w nowszych łańcuchach certyfikatów.

    Uzyskaj odniesienie do biblioteki parsera CBOR, która jest najbardziej odpowiednia dla Twojego zestawu narzędzi. Znajdź najbliższy certyfikat główny, który zawiera informacje o wdrożeniu rozszerzenia certyfikatu. Użyj parsera, aby wyodrębnić z tego certyfikatu dane rozszerzenia certyfikatu informacji.

    Więcej informacji znajdziesz w sekcji dotyczącej schematu danych rozszerzenia z informacjami o inicjowaniu.

  6. Uzyskaj odwołanie do biblioteki parsowania ASN.1, która jest najbardziej odpowiednia dla Twojego zestawu narzędzi. Znajdź certyfikat najbliżej głównego, który zawiera rozszerzenie certyfikatu klucza atestackiego. Jeśli rozszerzenie certyfikatu informacji o obrocie jest obecne, rozszerzenie certyfikatu potwierdzenia klucza musi znajdować się w następnym certyfikacie. Użyj parsera, aby wyodrębnić dane rozszerzenia certyfikatu atestu klucza z tego certyfikatu.

    Uwaga: nie zakładaj, że rozszerzenie certyfikatu atestu klucza znajduje się w certyfikacie liścia łańcucha. Tylko pierwsze wystąpienie rozszerzenia w łańcuchu może być wiarygodne. Wszystkie kolejne instancje rozszerzenia nie zostały wydane przez bezpieczny sprzęt i mogą być wydane przez atakującego, który rozszerzył łańcuch, próbując utworzyć fałszywe oświadczenia dla niezaufanych kluczy.

    Plik z atestem klucza używa parsowania ASN.1 z Bouncy Castle do wyodrębniania danych rozszerzenia certyfikatu atesta. Możesz użyć tego przykładu jako punktu odniesienia do utworzenia własnego parsowania.

    Więcej informacji znajdziesz w sekcji dotyczącej schematu danych rozszerzenia weryfikacji klucza.

  7. Sprawdź dane rozszerzeń pobrane w poprzednich krokach, aby zachować spójność, i porównaj je z zestawem wartości, które powinien zawierać klucz wspierany sprzętowo.

Certyfikaty główne

Zaufanie do zaświadczeń zależy od głównego certyfikatu łańcucha. Urządzenia z Androidem, które przeszły testy wymagane do korzystania z pakietu aplikacji Google, w tym Google Play, i zostały wprowadzone na Androidzie 7.0 (poziom interfejsu API 24) lub nowszym, powinny używać kluczy atestu podpisanych certyfikatem głównym Google poświadczania sprzętu. Pamiętaj, że do wersji Androida 8.0 (poziom interfejsu API 26) nie było wymagane potwierdzenie. Klucz publiczny głównego węzła ma postać:

  -----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-----
Wydane wcześniej certyfikaty główne
    -----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-----
  

Jeśli otrzymany certyfikat główny w łańcuchu potwierdzenia zawiera ten klucz publiczny i żaden z certyfikatów w łańcuchu nie został cofnięty, pamiętaj, że:

  1. Klucz znajduje się w sprzęcie, który według Google jest bezpieczny.
  2. Ma właściwości opisane w certyfikacie.

Jeśli łańcuch uwierzytelniania zawiera inny klucz publiczny głównego wierzchołka, Google nie składa żadnych oświadczeń dotyczących bezpieczeństwa sprzętu. Nie oznacza to, że klucz został skompromitowany, tylko że poświadczenia nie potwierdzają, że klucz jest na bezpiecznym sprzęcie. Odpowiednio dostosuj swoje założenia dotyczące bezpieczeństwa.

Jeśli certyfikat główny nie zawiera klucza publicznego na tej stronie, może to być spowodowane 2 przyczynami:

  • Najprawdopodobniej urządzenie zostało uruchomione z wersją Androida niższą niż 7.0 i nie obsługuje weryfikacji za pomocą sprzętu. W tym przypadku Android ma implementację oprogramowania do przeprowadzania atesta, która generuje ten sam rodzaj certyfikatu, ale podpisany kluczem zakodowanym na stałe w źródle Androida. Ponieważ ten klucz podpisywania nie jest tajny, atest mógł zostać utworzony przez osobę przeprowadzającą atak, która podszywa się pod bezpieczny sprzęt.
  • Innym prawdopodobnym powodem jest to, że urządzenie nie jest urządzeniem Google Play. W takim przypadku producent urządzenia może utworzyć własny rdzeń i stwierdzić, cokolwiek chce, na temat tego, co oznacza weryfikacja. Zapoznaj się z dokumentacją producenta urządzenia. Pamiętaj, że w momencie pisania tego tekstu Google nie zna żadnego producenta urządzeń, który to zrobił.

Lista stanów odwołania certyfikatów

Klucze uwierzytelniające mogą zostać cofnięte z różnych powodów, m.in. z powodu niewłaściwego ich użycia lub podejrzenia o wydobycie przez atakującego. Dlatego tak ważne jest, aby stan każdego certyfikatu w łańcuchu dokumentów potwierdzających został sprawdzony na liście oficjalnych certyfikatów odwołanych (CRL). Ta lista jest obsługiwana przez Google i opublikowana na https://android.googleapis.com/attestation/status. Nagłówek Cache-Control w odpowiedzi HTTP określa, jak często sprawdzać dostępność aktualizacji, więc żądanie sieciowe nie jest wymagane w przypadku każdego zweryfikowanego certyfikatu. Ten adres URL zwraca plik JSON zawierający stan odwołania wszystkich certyfikatów, które nie mają zwykłego stanu prawidłowego. Format pliku JSON musi być zgodny z definicją schematu JSON (wersja 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
}

Przykładowy plik 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"
    }
  }
}

Schemat danych rozszerzenia atestu kluczy

Rozszerzenie atestu klucza ma OID 1.3.6.1.4.1.11129.2.1.17. Rozszerzenie przechowuje informacje zgodnie ze schematem ASN.1.

Poniższa lista zawiera opis każdego elementu schematu:

KeyDescription

Ta sekwencja wartości zawiera ogólne informacje o parze kluczy weryfikowanej za pomocą uwierzytelnienia klucza i zapewnia łatwy dostęp do dodatkowych szczegółów.

attestationVersion
Wersja funkcji atestacji klucza.
WartośćWersja
1Keymaster w wersji 2.0
2Keymaster w wersji 3.0
3Keymaster w wersji 4.0
4Keymaster w wersji 4.1
100KeyMint w wersji 1.0
200KeyMint w wersji 2.0
300KeyMint w wersji 3.0
attestationSecurityLevel

Poziom bezpieczeństwa dokumentu.

Ostrzeżenie: chociaż można potwierdzać klucze przechowywane w systemie Android – czyli jeśli wartość attestationSecurityLevel jest ustawiona na „Oprogramowanie”, nie będziesz mieć zaufania do tych atestów, jeśli system Android zostanie zhakowany.

keymasterVersion/keyMintVersion
Wersja warstwy abstrakcji sprzętowej (HAL) Keymaster lub KeyMint.
WartośćWersja
0Wersja Keymastera 0.2 lub 0.3
1Keymaster w wersji 1.0
2Keymaster w wersji 2.0
3Keymaster w wersji 3.0
4Keymaster w wersji 4.0
41Keymaster w wersji 4.1
100KeyMint w wersji 1.0
200KeyMint w wersji 2.0
300KeyMint w wersji 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Poziom bezpieczeństwa wdrożenia Keymastera lub KeyMinta.
attestationChallenge
Zawiera wyzwanie podane podczas tworzenia klucza. Sprawdź, czy ta wartość jest zgodna z wartością podaną przez Twój serwer i zapisaną w tagu autoryzacji Tag::ATTESTATION_CHALLENGE. W przeciwnym razie usługa może być podatna na odtwarzanie starych certyfikatów.
uniqueId
Ta wartość identyfikuje urządzenie, ale tylko przez ograniczony czas. Jest on obliczany i jest używany tylko przez aplikacje systemowe. We wszystkich innych aplikacjach pole uniqueId jest puste.
softwareEnforced
Opcjonalnie. Lista autoryzacji Keymaster / KeyMint wymuszana przez system Android, a nie przez zaufane środowisko wykonawcze urządzenia (Trusted Execution Environment). Informacje na tej liście autoryzacji są zbierane lub generowane przez kod, który jest częścią platformy i przechowywany na partycji systemowej urządzenia. Zawartość tej listy autoryzacji może być traktowana jako zaufana, o ile na urządzeniu jest uruchomiony system operacyjny zgodny z modelem zabezpieczeń platformy Android. Wszystkie certyfikowane urządzenia z Androidem są zgodne z tym modelem zabezpieczeń, więc jeśli urządzenie jest zablokowane i stan weryfikacji podczas uruchamiania to Verified, wartości powinny być wiarygodne. Na zmodyfikowanym urządzeniu, na którym bootloader jest odblokowany, użytkownik może zainstalować system operacyjny, który nie jest zgodny z modelem zabezpieczeń platformy Android, więc wartości w tym polu mogą być wybrane przez użytkownika dowolnie.
hardwareEnforced
Opcjonalnie. Lista autoryzacji Keymaster/KeyMint, która jest wymuszana przez zaufane środowisko wykonawcze (TEE) urządzenia. Informacje na tej liście autoryzacji są zbierane lub generowane przez kod, który stanowi część bezpiecznego sprzętu i nie jest kontrolowany przez platformę. Na przykład informacje z tej listy autoryzacji pochodzą z programu rozruchowego urządzenia lub z uruchomionego na nim modułu TEE. Pola na tej liście autoryzacji, które nie są ustawione bezpośrednio przez KeyMint, są udostępniane przez inne części bezpiecznego sprzętu (np. program rozruchowy), korzystając z bezpiecznych kanałów komunikacji, które nie wymagają zaufania platformy. Różnica między bezpiecznym sprzętem a systemem Android polega na tym, że użytkownik nie może modyfikować kodu działającego na bezpiecznym sprzęcie (firmware), więc nie może on zmieniać wartości na tej liście autoryzacji.

SecurityLevel

Ta struktura danych wskazuje, w jakim stopniu funkcja oprogramowania (np. para kluczy) jest chroniona na podstawie jej lokalizacji na urządzeniu.

Struktura danych to wyliczenie, więc przyjmuje dokładnie jedną z tych wartości:

Magazyn kluczy
Zaimplementowana w systemie Android logika tworzenia funkcji i zarządzania nią. W celu tworzenia i przechowywania par kluczy to miejsce jest mniej bezpieczne niż TEE, ale bezpieczniejsze niż przestrzeń procesu aplikacji.
TrustedEnvironment
Logika tworzenia funkcji i zarządzania nią jest zaimplementowana na bezpiecznym sprzęcie, takim jak TEE. W celu tworzenia i przechowywania par kluczy to miejsce jest bezpieczniejsze, ponieważ sprzęt zabezpieczony jest bardzo odporny na zdalne naruszenie zabezpieczeń.
StrongBox,
Logika tworzenia funkcji i zarządzania nią jest zaimplementowana w specjalnym module zabezpieczeń sprzętu. W celu tworzenia i przechowywania par kluczy ta lokalizacja jest bardziej bezpieczna, ponieważ jest bardzo odporna na zdalne naruszenie zabezpieczeń i ataki sprzętowe na moduł.
Oprogramowanie
Zasady tworzenia funkcji i zarządzania nią są implementowane w KeyMint lub w Keymaster, który nie działa w bezpiecznym środowisku. W celu tworzenia i przechowywania par kluczy to miejsce jest mniej bezpieczne niż TEE, ale bezpieczniejsze niż przestrzeń procesów aplikacji.

Lista autoryzacji

Ta struktura danych zawiera właściwości pary kluczy zdefiniowane w warstwie abstrakcji sprzętowej (HAL) Keymaster lub KeyMint. Porównujesz te wartości z aktualnym stanem urządzenia lub z zestawem oczekiwanych wartości, aby sprawdzić, czy para kluczy nadal nadaje się do użycia w aplikacji.

Każda nazwa pola odpowiada tagowi autoryzacji Keymaster / KeyMint o podobnej nazwie. Na przykład pole keySize na liście autoryzacji odpowiada tagowi autoryzacji Tag::KEY_SIZE.

Specyfikacja interfejsu AIDL zawiera ostateczne informacje o tagach autoryzacji. Określa on wartość i typ każdego tagu, a także wskazuje, czy tag ma być obecny na liście autoryzacji hardwareEnforced (co oznacza, że tag jest wymuszony w bezpiecznym środowisku), czy na liście autoryzacji softwareEnforced (co oznacza, że tag jest wymuszony przez Androida, zazwyczaj przez Keystore).

Każde pole na tej liście jest opcjonalne:

purpose
Odpowiada tagowi autoryzacji Tag::PURPOSE, który ma identyfikator tagu o wartości 1.
algorithm

Odpowiada tagowi autoryzacji Tag::ALGORITHM, który ma identyfikator tagu równy 2.

W obiekcie AuthorizationList atestu wartość algorytmu to zawsze RSA lub EC.

keySize
Zgodnie z tagiem autoryzacji Tag::KEY_SIZE, który używa wartości identyfikatora tagu 3.
digest
Zgodny z tagiem autoryzacji Tag::DIGEST, który używa wartości identyfikatora tagu 5.
padding
Zgodnie z tagiem autoryzacji Tag::PADDING, który używa wartości identyfikatora tagu 6.
ecCurve

Odpowiada tagowi autoryzacji Tag::EC_CURVE, który ma identyfikator tagu o wartości 10.

Zbiór parametrów służących do generowania pary kluczy krzywej eliptycznej (EC), która używa ECDSA do podpisywania i weryfikacji w systemowym magazynie kluczy Androida.

rsaPublicExponent
Zgodnie z tagiem autoryzacji Tag::RSA_PUBLIC_EXPONENT, który używa wartości identyfikatora tagu 200.
mgfDigest

Prezentuje się tylko w wersji atestu klucza >= 100.

Odpowiada tagowi autoryzacji Tag::RSA_OAEP_MGF_DIGEST KeyMint, który używa wartości identyfikatora tagu 203.
rollbackResistance

Dostępne tylko w wersji weryfikacji klucza ≥3.

Odpowiada tagowi autoryzacji Tag::ROLLBACK_RESISTANT, który ma wartość identyfikatora tagu 303.

earlyBootOnly

Prezentuje się tylko w wersji atestu klucza >= 4.

Odpowiada tagowi autoryzacji Tag::EARLY_BOOT_ONLY, który ma wartość identyfikatora tagu 305.

activeDateTime
Zgodnie z  Tag::ACTIVE_DATETIMEtagiem autoryzacji, który używa wartości identyfikatora tagu 400.
originationExpireDateTime
Zgodnie z  Tag::ORIGINATION_EXPIRE_DATETIMEtagiem autoryzacji Keymaster, który używa wartości identyfikatora tagu 401.
usageExpireDateTime
Odpowiada tagowi autoryzacji Tag::USAGE_EXPIRE_DATETIME, który korzysta z wartości identyfikatora tagu 402.
usageCountLimit
Zgodny z tagiem autoryzacji Tag::USAGE_COUNT_LIMIT, który używa wartości identyfikatora tagu 405.
noAuthRequired

Odpowiada tagowi autoryzacji Tag::NO_AUTH_REQUIRED, który ma wartość identyfikatora tagu 503.

userAuthType
Odpowiada tagowi autoryzacji Tag::USER_AUTH_TYPE, który korzysta z wartości identyfikatora tagu 504.
authTimeout
Zgodny z tagiem autoryzacji Tag::AUTH_TIMEOUT, który używa wartości identyfikatora tagu 505.
allowWhileOnBody

Odpowiada tagowi autoryzacji Tag::ALLOW_WHILE_ON_BODY, który używa wartości identyfikatora tagu 506.

Umożliwia używanie klucza po upływie czasu oczekiwania na uwierzytelnienie, jeśli użytkownik nadal nosi urządzenie na ciele. Pamiętaj, że czujnik na ciele użytkownika określa, czy urządzenie jest noszone na ciele użytkownika.

trustedUserPresenceRequired

Dostępne tylko w wersji weryfikacji klucza ≥3.

Odpowiada tagowi autoryzacji Tag::TRUSTED_USER_PRESENCE_REQUIRED, który używa wartości identyfikatora tagu 507.

Określa, że klucz można używać tylko wtedy, gdy użytkownik przedstawił dowód swojej fizycznej obecności. Oto kilka przykładów:

  • W przypadku klucza StrongBox: przycisk sprzętowy podłączony bezpośrednio do pinu na urządzeniu StrongBox.
  • W przypadku klucza TEE uwierzytelnianie odciskiem palca zapewnia dowód obecności, o ile TEE ma wyłączną kontrolę nad skanerem i wykonuje proces dopasowywania odcisków palców.
trustedConfirmationRequired

Dostępne tylko w wersji weryfikacji klucza ≥3.

Odpowiada tagowi autoryzacji Tag::TRUSTED_CONFIRMATION_REQUIRED, który ma wartość identyfikatora tagu 508.

Określa, że klucza można używać tylko wtedy, gdy użytkownik potwierdzi dane do podpisania za pomocą tokena zatwierdzenia. Więcej informacji o uzyskiwaniu potwierdzenia użytkownika znajdziesz w sekcji Zabezpieczone potwierdzenie Androida.

Uwaga: ten tag dotyczy tylko kluczy, które używają celu SIGN.

unlockedDeviceRequired

Dostępne tylko w wersji weryfikacji klucza ≥3.

Odpowiada tagowi autoryzacji Tag::UNLOCKED_DEVICE_REQUIRED, który ma wartość identyfikatora tagu 509.

allApplications

Odpowiada tagowi autoryzacji Tag::ALL_APPLICATIONS, który korzysta z wartości identyfikatora tagu 600.

Wskazuje, czy wszystkie aplikacje na urządzeniu mają dostęp do pary kluczy.

applicationId
Zgodna z tagiem autoryzacji Tag::APPLICATION_ID, który używa wartości identyfikatora tagu 601.
creationDateTime
Zgodny z tagiem autoryzacji Tag::CREATION_DATETIME, który używa wartości identyfikatora tagu 701.
origin

Odpowiada tagowi autoryzacji Tag::ORIGIN, który ma wartość identyfikatora tagu 702.

rollbackResistant

Jest to możliwe tylko w wersji 1 i 2 atestu klucza.

Odpowiada tagowi autoryzacji Tag::ROLLBACK_RESISTANT, który używa wartości identyfikatora tagu 703.

rootOfTrust

Odpowiada tagowi autoryzacji Tag::ROOT_OF_TRUST, który używa wartości identyfikatora tagu 704.

Więcej informacji znajdziesz w sekcji opisującej strukturę danych RootOfTrust.

osVersion

Odpowiada tagowi autoryzacji Tag::OS_VERSION, który korzysta z wartości identyfikatora tagu 705.

Wersja systemu operacyjnego Android powiązana z kluczem Keymasterem, podana jako 6-cyfrowa liczba całkowita. Na przykład wersja 8.1.0 jest oznaczona jako 080100.

Na liście autoryzacji znajduje się tylko Keymaster w wersji 1.0 lub nowszej.

osPatchLevel

Odpowiada tagowi autoryzacji Tag::PATCHLEVEL, który korzysta z wartości identyfikatora tagu 706.

Miesiąc i rok powiązane z używanym w Keymasterze poprawką bezpieczeństwa, podany jako sześciocyfrowa liczba całkowita. Na przykład poprawka z sierpnia 2018 r. ma postać 201808.

Na liście autoryzacji znajduje się tylko Keymaster w wersji 1.0 lub nowszej.

attestationApplicationId

Występuje tylko w wersjach klucza z weryfikacją ≥2.

Odpowiada tagowi autoryzacji Keymaster Tag::ATTESTATION_APPLICATION_ID, który używa wartości identyfikatora tagu 709.

Więcej informacji znajdziesz w sekcji opisującej strukturę danych AttestationApplicationId.

attestationIdBrand

Występuje tylko w wersjach klucza z weryfikacją ≥2.

Odpowiada tagowi Keymaster Tag::ATTESTATION_ID_BRAND, który ma identyfikator tagu o wartości 710.

attestationIdDevice

Jest widoczny tylko w wersjach atestu klucza >= 2.

Odpowiada tagowi Keymaster (Tag::ATTESTATION_ID_DEVICE), który używa wartości identyfikatora 711.

attestationIdProduct

Jest widoczny tylko w wersjach atestu klucza >= 2.

Odpowiada tagowi Keymaster Tag::ATTESTATION_ID_PRODUCT, który ma identyfikator tagu o wartości 712.

attestationIdSerial

Występuje tylko w wersjach klucza z weryfikacją ≥2.

Odpowiada tagowi Keymaster (Tag::ATTESTATION_ID_SERIAL), który używa wartości identyfikatora 713.

attestationIdImei

Występuje tylko w wersjach klucza z weryfikacją ≥2.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_IMEI, który korzysta z wartości identyfikatora tagu 714.

attestationIdMeid

Występuje tylko w wersjach klucza z weryfikacją ≥2.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_MEID, który ma wartość identyfikatora tagu 715.

attestationIdManufacturer

Jest widoczny tylko w wersjach atestu klucza >= 2.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_MANUFACTURER, który używa wartości identyfikatora tagu 716.

attestationIdModel

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_MODEL, który ma wartość identyfikatora tagu 717.

vendorPatchLevel

Dostępne tylko w wersjach weryfikacji klucza >= 3.

Odpowiada tagowi autoryzacji Tag::VENDOR_PATCHLEVEL, który ma wartość identyfikatora tagu 718.

Określa poziom zabezpieczeń obrazu dostawcy, który musi być zainstalowany na urządzeniu, aby można było używać tego klucza. Wartość jest wyświetlana w formacie RRRRMMDD, co oznacza datę poprawki zabezpieczeń od dostawcy. Jeśli na przykład klucz został wygenerowany na urządzeniu z Androidem, na którym zainstalowano poprawkę zabezpieczeń z 1 sierpnia 2018 r., wartość ta wynosi 20180801.

bootPatchLevel

Dostępne tylko w wersjach weryfikacji klucza >= 3.

Odpowiada tagowi autoryzacji Tag::BOOT_PATCHLEVEL, który ma wartość identyfikatora tagu 719.

Określa poziom poprawki zabezpieczeń obrazu jądra, która musi być zainstalowana na urządzeniu, aby można było używać tego klucza. Wartość jest wyświetlana w formie RRRRMMDD, co oznacza datę poprawki zabezpieczeń systemu. Jeśli na przykład klucz został wygenerowany na urządzeniu z Androidem z zainstalowaną poprawką bezpieczeństwa z 5 sierpnia 2018 r., jego wartość będzie wynosić 20180805.

deviceUniqueAttestation

Dostępne tylko w wersjach weryfikacji klucza >= 4.

Odpowiada tagowi autoryzacji Tag::DEVICE_UNIQUE_ATTESTATION, który ma wartość identyfikatora tagu 720.

attestationIdSecondImei

Występuje tylko w wersjach klucza z atestatem większym niż 300.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_SECOND_IMEI, który ma wartość identyfikatora tagu 723.

RootOfTrust

Ten zbiór wartości określa kluczowe informacje o stanie urządzenia.

Wszystkie pola na tej liście są wymagane:

verifiedBootKey

Bezpieczny hasz klucza, który weryfikuje obraz systemu. W przypadku tego hasza zalecamy użycie algorytmu SHA-256.

deviceLocked
Prawda, jeśli program rozruchowy urządzenia jest zablokowany, co umożliwia sprawdzanie weryfikacji podczas uruchamiania i zapobiega flashowaniu na urządzeniu niepodpisanego obrazu urządzenia. Więcej informacji o tej funkcji znajdziesz w dokumentacji dotyczącej weryfikacji systemu za pomocą funkcji Boot.
verifiedBootState
Stan uruchamiania urządzenia zgodnie z funkcją weryfikacji podczas uruchamiania.
verifiedBootHash

Dostępne tylko w wersjach weryfikacji klucza >= 3.

skrót wszystkich danych chronionych przez funkcję Verified Boot; W przypadku urządzeń korzystających z weryfikacji podczas uruchamiania w Androidzie ta wartość zawiera podsumowanie struktury VBMeta lub struktury metadanych weryfikacji podczas uruchamiania.

Więcej informacji o tym, jak obliczać tę wartość, znajdziesz w artykule ze skrótem VBMeta.

VerifiedBootState

Ta struktura danych określa bieżący stan rozruchu urządzenia, który wskazuje poziom ochrony użytkownika i aplikacji po zakończeniu rozruchu. Więcej informacji o tej funkcji znajdziesz w sekcji Stan rozruchu w dokumentacji dotyczącej weryfikacji rozruchu.

Ta struktura danych jest wyliczalnikiem, więc przyjmuje jedną z tych wartości:

Zweryfikowano

Wskazuje pełny łańcuch zaufania, który obejmuje program rozruchowy, partycję rozruchową i wszystkie zweryfikowane partycje.

Gdy urządzenie jest w tym stanie rozruchu, verifiedBootKey to hasz certyfikatu umieszczonego na urządzeniu, który producent dodaje do jego fabryki w pamięci ROM.

Samodzielnie podpisany

Wskazuje, że certyfikat osadzony w urządzeniu zweryfikował partycję rozruchową urządzenia i że podpis jest prawidłowy.

Gdy urządzenie jest w tym stanie rozruchu, verifiedBootKey to hasz certyfikatu zainstalowanego przez użytkownika, który podpisuje partycję rozruchową dodaną przez użytkownika do urządzenia w miejsce pierwotnej, dostarczonej przez producenta partycji.

Niezweryfikowany
Wskazuje, że użytkownik może swobodnie modyfikować urządzenie. Dlatego użytkownik jest odpowiedzialny za sprawdzenie integralności urządzenia.
Niepowodzenie
Wskazuje, że weryfikacja urządzenia zakończyła się niepowodzeniem. Certyfikat atestacyjnym nigdy nie powinien używać tej wartości dla VerifiedBootState.

AttestationApplicationId

Ta struktura danych odzwierciedla pogląd platformy Androida na temat tego, które aplikacje mogą używać tajnego klucza w ramach uwierzytelnienia. Identyfikator może obejmować wiele pakietów, jeśli tylko mają one ten sam identyfikator UID. Ciąg oktetów jest sformatowany zgodnie z tym schematem ASN.1:

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

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
informacje_o_pakiecie
Zestaw obiektów AttestationPackageInfo, z których każdy zawiera nazwę pakietu i numer wersji.
podsumowania_podpisu

Zestaw skrótów SHA-256 certyfikatów podpisywania aplikacji. Aplikacja może mieć wiele łańcuchów certyfikatów klucza podpisywania. W przypadku każdego z nich certyfikat „liścia” jest przetwarzany i umieszczany w polu signature_digests. Nazwa pola jest myląca, ponieważ przetworzone dane to certyfikaty podpisu aplikacji, a nie podpisy aplikacji, ponieważ nazwa pochodzi od klasy Signaturezwracanej przez wywołanie funkcji getPackageInfo(). Ten fragment kodu pokazuje przykładowy zestaw:

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

Schemat danych rozszerzenia informacji o konfiguracji

Rozszerzenie informacji o obsługiwaniu administracyjnym ma identyfikator 1.3.6.1.4.1.11129.2.1.30. To rozszerzenie udostępnia informacje o urządzeniu znane serwerowi obsługi administracyjnej. To rozszerzenie jest zgodne ze schematem CDDL.

  {
        1 : int,   ; certificates issued
  }

Mapa nie jest wersjonowana i można dodawać do niej nowe pola opcjonalne.

certs_issued

przybliżoną liczbę certyfikatów wydanych na urządzenie w ciągu ostatnich 30 dni; Ta wartość może służyć jako sygnał o potencjalnym nadużyciu, jeśli jest większa od średniej o kilka rzędów wielkości.