Memverifikasi pasangan kunci yang didukung hardware dengan Pengesahan Kunci

Pengesahan Kunci memberi Anda keyakinan lebih bahwa kunci yang Anda gunakan dalam aplikasi disimpan dalam keystore yang didukung hardware perangkat. Bagian berikut menjelaskan cara memverifikasi properti kunci yang didukung hardware dan cara menafsirkan data ekstensi sertifikat pengesahan.

Catatan: Sebelum Anda memverifikasi properti kunci yang didukung hardware di perangkat dalam lingkungan level produksi, pastikan perangkat tersebut mendukung pengesahan kunci level hardware. Untuk melakukannya, pastikan rantai sertifikat pengesahan berisi root certificate yang ditandatangani oleh kunci utama pengesahan Google dan elemen attestationSecurityLevel dalam struktur data deskripsi kunci disetel ke level keamanan TrustedEnvironment.

Selain itu, penting untuk memverifikasi tanda tangan dalam rantai sertifikat dan mengonfirmasi tidak ada kunci dalam rantai yang dicabut dengan memeriksa daftar status pencabutan sertifikat. Jangan sepenuhnya memercayai pengesahan tersebut, kecuali jika semuanya valid dan root adalah kunci utama Google. Namun, perlu diketahui bahwa perangkat yang berisi sertifikat yang dicabut setidaknya masih dapat dipercaya seperti perangkat yang hanya mendukung pengesahan software. Adanya pengesahan yang sepenuhnya valid menjadi indikator positif yang kuat. Tidak adanya pengesahan merupakan indikator netral, bukan negatif.

Mengambil dan memverifikasi pasangan kunci yang didukung hardware

Selama pengesahan kunci, Anda menentukan alias pasangan kunci dan mengambil rantai sertifikatnya, yang dapat Anda gunakan untuk memverifikasi properti pasangan kunci tersebut.

Jika perangkat mendukung pengesahan kunci level hardware, root certificate dalam rantai ditandatangani menggunakan kunci utama pengesahan yang disediakan dengan aman ke keystore yang didukung hardware di perangkat.

Catatan: Pada perangkat yang dikirimkan dengan pengesahan kunci level hardware, Android 7.0 (API level 24) atau lebih tinggi, dan layanan Google Play, root certificate ditandatangani dengan kunci utama pengesahan Google. Pastikan bahwa root certificate terdaftar di bagian root certificate.

Untuk mengimplementasikan pengesahan kunci, lakukan langkah-langkah berikut:

  1. Gunakan metode getCertificateChain() objek KeyStore untuk mendapatkan referensi ke rantai sertifikat X.509 yang terkait dengan keystore yang didukung hardware.
  2. Kirim sertifikat ke server terpisah yang Anda percayai untuk validasi.

    Perhatian: Jangan selesaikan proses validasi berikut di perangkat yang sama dengan KeyStore. Jika sistem Android pada perangkat tersebut disusupi, proses validasi menjadi bisa memercayai sesuatu yang tidak dapat dipercaya.

  3. Dapatkan referensi ke library validasi dan penguraian rantai sertifikat X.509 yang paling sesuai untuk rangkaian alat Anda. Pastikan bahwa root certificate publik dapat dipercaya dan setiap sertifikat menandatangani sertifikat berikutnya di dalam rantai.

  4. Periksa status pencabutan setiap sertifikat untuk memastikan tidak ada sertifikat yang dicabut.

  5. Periksa ekstensi sertifikat informasi penyediaan yang hanya berada dalam rantai sertifikat yang lebih baru secara opsional.

    Dapatkan referensi ke library parser CBOR yang paling sesuai untuk rangkaian alat Anda. Temukan sertifikat terdekat ke root yang berisi ekstensi sertifikat informasi penyediaan. Gunakan parser untuk mengekstrak data ekstensi sertifikat informasi penyediaan dari sertifikat tersebut.

    Lihat bagian skema data ekstensi informasi penyediaan untuk mengetahui detail selengkapnya.

  6. Dapatkan referensi ke library parser ASN.1 yang paling sesuai untuk rangkaian alat Anda. Temukan sertifikat terdekat ke root yang berisi ekstensi sertifikat pengesahan kunci. Jika ada ekstensi sertifikat informasi penyediaan, ekstensi sertifikat pengesahan kunci harus berada dalam sertifikat berikutnya secara langsung. Gunakan parser untuk mengekstrak data ekstensi sertifikat pengesahan kunci dari sertifikat tersebut.

    Perhatian: Jangan berasumsi bahwa ekstensi sertifikat pengesahan kunci berada dalam sertifikat entitas akhir rantai. Hanya kemunculan ekstensi pertama dalam rantai yang dapat dipercaya. Setiap instance ekstensi lebih lanjut belum dikeluarkan oleh hardware yang aman dan dapat dikeluarkan oleh penyerang yang memperluas rantai sambil mencoba membuat pengesahan palsu untuk kunci yang tidak tepercaya.

    Sampel Pengesahan Kunci menggunakan parser ASN.1 dari Bouncy Castle untuk mengekstrak data ekstensi sertifikat pengesahan. Anda dapat menggunakan sampel ini sebagai referensi untuk membuat parser Anda sendiri.

    Lihat bagian skema data ekstensi pengesahan kunci untuk mengetahui detail selengkapnya.

  7. Periksa konsistensi data ekstensi yang telah Anda ambil pada langkah sebelumnya, dan bandingkan dengan kumpulan nilai yang Anda harapkan untuk dimuat oleh kunci yang didukung hardware.

Root certificate

Validitas pengesahan tergantung pada root certificate rantai. Perangkat Android yang telah lulus pengujian harus memiliki rangkaian aplikasi Google, termasuk Google Play, dan yang diluncurkan dengan Android 7.0 (API level 24) atau lebih tinggi harus menggunakan kunci pengesahan yang ditandatangani oleh sertifikat Root Pengesahan Hardware Google. Perhatikan bahwa pengesahan tidak diperlukan hingga Android 8.0 (API level 26). Root kunci publik adalah sebagai berikut:

  -----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-----
Root Certificate yang Sudah Diterbitkan Sebelumnya
    -----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-----
  

Jika root certificate dalam rantai pengesahan yang Anda terima berisi kunci publik dan tidak ada sertifikat dalam rantai yang dicabut, dapat dipastikan bahwa:

  1. Kunci Anda berada di hardware yang Google yakini aman; dan
  2. Kunci memiliki properti yang dijelaskan dalam sertifikat pengesahan.

Jika rantai pengesahan memiliki root kunci publik lain, Google tidak membuat klaim apa pun tentang keamanan hardware. Hal ini tidak berarti kunci Anda disusupi, hanya saja pengesahan tidak membuktikan kunci tersebut berada dalam hardware yang aman. Sesuaikan asumsi keamanan Anda dengan semestinya.

Jika root certificate tidak berisi kunci publik di halaman ini, ada dua kemungkinan alasan:

  • Kemungkinan besar, perangkat diluncurkan dengan versi Android kurang dari 7.0 dan tidak mendukung pengesahan hardware. Dalam hal ini, Android memiliki implementasi software pengesahan yang menghasilkan sertifikat pengesahan yang sama, tetapi ditandatangani dengan kunci hardcode dalam kode sumber Android. Karena kunci penandatanganan ini tidak bersifat rahasia, pengesahan dapat dibuat oleh penyerang yang berpura-pura menyediakan hardware yang aman.
  • Kemungkinan alasan lainnya adalah perangkat tersebut bukan perangkat Google Play. Dalam hal ini, pembuat perangkat bebas untuk membuat root mereka sendiri dan membuat klaim apa pun yang mereka inginkan mengenai arti pengesahan tersebut. Lihat dokumentasi pembuat perangkat. Perhatikan bahwa saat tulisan ini dibuat, Google tidak mengetahui adanya pembuat perangkat yang telah melakukan hal tersebut.

Daftar status pencabutan sertifikat

Kunci pengesahan dapat dicabut karena berbagai alasan, termasuk kesalahan penanganan atau dugaan ekstraksi oleh penyerang. Oleh karena itu, status setiap sertifikat dalam rantai pengesahan harus diperiksa dengan daftar status pencabutan sertifikat (CRL) resmi. Daftar ini dikelola oleh Google dan dipublikasikan di: https://android.googleapis.com/attestation/status. Header Cache-Control dalam respons HTTP menentukan seberapa sering pemeriksaan update dilakukan sehingga tidak diperlukan permintaan jaringan untuk setiap sertifikat yang diverifikasi. URL ini menampilkan file JSON yang berisi status pencabutan sertifikat apa pun yang tidak memiliki status valid yang normal. Format file JSON mematuhi definisi Skema JSON (draf 07) berikut:

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

Contoh CRL:

{
  "entries": {
    "2c8cdddfd5e03bfc": {
      "status": "REVOKED",
      "expires": "2020-11-13",
      "reason": "KEY_COMPROMISE",
      "comment": "Key stored on unsecure system"
    },
    "c8966fcb2fbb0d7a": {
      "status": "SUSPENDED",
      "reason": "SOFTWARE_FLAW",
      "comment": "Bug in keystore causes this key malfunction b/555555"
    }
  }
}

CRL Lama

URL CRL yang tersemat dalam sertifikat pengesahan lama terus beroperasi. Sertifikat pengesahan baru tidak lagi berisi ekstensi URL CRL. Status sertifikat lama juga disertakan dalam daftar status pengesahan, sehingga developer dapat dengan aman beralih menggunakan daftar status pengesahan untuk sertifikat baru dan lama. Contoh cara memverifikasi kunci pengesahan Android dengan benar disertakan dalam contoh Pengesahan Kunci.

Skema data ekstensi pengesahan kunci

Ekstensi pengesahan kunci memiliki OID 1.3.6.1.4.1.11129.2.1.17. Ekstensi menyimpan informasi sesuai dengan skema ASN.1. Untuk melihat skema yang sesuai dengan versi pengesahan yang Anda gunakan, pilih tab yang sesuai di daftar skema berikut:

Versi 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

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

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

Versi 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

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

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

Versi 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

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

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

Versi 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
}

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

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

Versi 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
}

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

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

Versi 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
}

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

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

Daftar berikut menampilkan deskripsi dari setiap elemen dalam skema:

KeyDescription

Urutan nilai ini menampilkan informasi umum tentang pasangan kunci yang diverifikasi melalui pengesahan kunci dan menyediakan akses mudah ke detail tambahan.

attestationVersion
Versi fitur pengesahan kunci.
NilaiVersi
1Keymaster versi 2.0
2Keymaster versi 3.0
3Keymaster versi 4.0
4Keymaster versi 4.1
100KeyMint versi 1.0
200KeyMint versi 2.0
attestationSecurityLevel

Level keamanan pengesahan.

Peringatan: Meskipun ada kemungkinan untuk mengesahkan kunci yang disimpan dalam sistem Android, yaitu jika nilai attestationSecurityLevel ditetapkan ke Software, Anda tidak dapat memercayai pengesahan ini jika sistem Android disusupi.

keymasterVersion / keyMintVersion
Versi KeyMaster atau KeyMint hardware abstraction layer (HAL).
NilaiVersi
0Keymaster versi 0.2 atau 0.3
1Keymaster versi 1.0
2Keymaster versi 2.0
3Keymaster versi 3.0
4Keymaster versi 4.0
41Keymaster versi 4.1
100KeyMint versi 1.0
200KeyMint versi 2.0
keymasterSecurityLevel / keyMintSecurityLevel
Level keamanan implementasi Keymaster/Keymint.
attestationChallenge
Berisi tantangan yang diberikan pada saat pembuatan kunci. Periksa apakah nilai ini cocok dengan nilai yang diberikan server Anda, seperti yang disimpan dalam tag otorisasi Tag::ATTESTATION_CHALLENGE. Jika tidak, layanan Anda mungkin rentan terhadap pemutaran ulang sertifikat pengesahan lama.
uniqueId
Nilai tersebut mengidentifikasi perangkat, tetapi hanya selama jangka waktu terbatas. Nilai dihitung dan hanya digunakan oleh aplikasi sistem. Di semua aplikasi lain, uniqueId kosong.
softwareEnforced
Opsional. Daftar otorisasi Keymaster / KeyMint yang diberlakukan oleh sistem Android, bukan oleh Trusted Execution Environment (TEE) perangkat.
teeEnforced
Opsional. Daftar otorisasi Keymaster / KeyMint yang diberlakukan oleh TEE perangkat.

SecurityLevel

Struktur data ini menunjukkan sejauh mana fitur software, seperti pasangan kunci, dilindungi berdasarkan lokasi dalam perangkat.

Karena struktur data berupa enumerasi, struktur tersebut secara tepat menggunakan salah satu nilai berikut:

Software
Logika untuk membuat dan mengelola fitur ini diimplementasikan dalam sistem Android. Untuk keperluan pembuatan dan penyimpanan pasangan kunci, lokasi ini kurang aman dibandingkan TEE, tetapi lebih aman dibandingkan ruang proses aplikasi Anda.
TrustedEnvironment
Logika untuk membuat dan mengelola fitur ini diimplementasikan dalam hardware yang aman, seperti TEE. Untuk keperluan pembuatan dan penyimpanan pasangan kunci, lokasi ini lebih aman karena hardware yang aman sangat tahan terhadap penyusupan jarak jauh.
StrongBox
Logika untuk membuat dan mengelola fitur ini diimplementasikan dalam modul keamanan hardware khusus. Untuk keperluan pembuatan dan penyimpanan pasangan kunci, lokasi ini lebih aman karena sangat tahan terhadap penyusupan jarak jauh dan serangan hardware terhadap modul.

AuthorizationList

Struktur data ini berisi properti pasangan kunci itu sendiri, seperti yang dijelaskan dalam Keymaster atau Keymint hardware abstraction layer (HAL). Anda membandingkan nilai ini dengan status perangkat saat ini atau dengan kumpulan nilai yang diharapkan guna memverifikasi bahwa pasangan kunci masih valid untuk digunakan dalam aplikasi Anda.

Setiap nama kolom sesuai dengan tag otorisasi Keymaster / KeyMint yang serupa. Misalnya, kolom keySize dalam daftar otorisasi sesuai dengan tag otorisasi Tag::KEY_SIZE.

Setiap kolom dalam daftar berikut bersifat opsional:

purpose
Sesuai dengan tag otorisasi Tag::PURPOSE, yang menggunakan nilai ID tag 1.
algorithm

Sesuai dengan tag otorisasi Tag::ALGORITHM, yang menggunakan nilai ID tag 2.

Dalam objek AuthorizationList pengesahan, nilai algoritme selalu RSA atau EC.

keySize
Sesuai dengan tag otorisasi Tag::KEY_SIZE, yang menggunakan nilai ID tag 3.
digest
Sesuai dengan tag otorisasi Tag::DIGEST, yang menggunakan nilai ID tag 5.
padding
Sesuai dengan tag otorisasi Tag::PADDING, yang menggunakan nilai ID tag 6.
ecCurve

Sesuai dengan tag otorisasi Tag::EC_CURVE, yang menggunakan nilai ID tag 10.

Kumpulan parameter yang digunakan untuk menghasilkan pasangan kunci elliptic curve (EC), yang menggunakan ECDSA untuk menandatangani dan memverifikasi, dalam keystore sistem Android.

rsaPublicExponent
Sesuai dengan tag otorisasi Tag::RSA_PUBLIC_EXPONENT, yang menggunakan nilai ID tag 200.
mgfDigest

Hanya ada di pengesahan kunci versi >= 100.

Sesuai dengan tag otorisasi KeyMint Tag::RSA_OAEP_MGF_DIGEST, yang menggunakan nilai ID tag 203.
rollbackResistance

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::ROLLBACK_RESISTANT, yang menggunakan nilai ID tag 303.

earlyBootOnly

Hanya ada di pengesahan kunci versi >= 4.

Sesuai dengan tag otorisasi Tag::EARLY_BOOT_ONLY, yang menggunakan nilai ID tag 305.

activeDateTime
Sesuai dengan tag otorisasi Tag::ACTIVE_DATETIME, yang menggunakan nilai ID tag 400.
originationExpireDateTime
Sesuai dengan tag otorisasi Keymaster Tag::ORIGINATION_EXPIRE_DATETIME, yang menggunakan nilai ID tag 401.
usageExpireDateTime
Sesuai dengan tag otorisasi Tag::USAGE_EXPIRE_DATETIME, yang menggunakan nilai ID tag 402.
usageCountLimit
Sesuai dengan tag otorisasi Tag::USAGE_COUNT_LIMIT, yang menggunakan nilai ID tag 405.
noAuthRequired

Sesuai dengan tag otorisasi Tag::NO_AUTH_REQUIRED, yang menggunakan nilai ID tag 503.

userAuthType
Sesuai dengan tag otorisasi Tag::USER_AUTH_TYPE, yang menggunakan nilai ID tag 504.
authTimeout
Sesuai dengan tag otorisasi Tag::AUTH_TIMEOUT, yang menggunakan nilai ID tag 505.
allowWhileOnBody

Sesuai dengan tag otorisasi Tag::ALLOW_WHILE_ON_BODY, yang menggunakan nilai ID tag 506.

Memungkinkan kunci untuk digunakan setelah periode waktu tunggu autentikasi jika pengguna masih mengenakan perangkat di tubuh mereka. Perhatikan bahwa sensor pada tubuh yang aman menentukan apakah perangkat sedang dikenakan pada tubuh pengguna.

trustedUserPresenceRequired

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::TRUSTED_USER_PRESENCE_REQUIRED, yang menggunakan nilai ID tag 507.

Menentukan bahwa kunci ini hanya dapat digunakan jika pengguna telah memberikan bukti kehadiran fisik. Beberapa contohnya meliputi:

  • Untuk kunci StrongBox, tombol hardware terpasang dengan pin pada perangkat StrongBox.
  • Untuk kunci TEE, autentikasi sidik jari memberikan bukti kehadiran fisik selama TEE memiliki kontrol eksklusif terhadap pemindai dan melakukan proses pencocokan sidik jari.
trustedConfirmationRequired

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::TRUSTED_CONFIRMATION_REQUIRED, yang menggunakan nilai ID tag 508.

Menentukan bahwa kunci hanya dapat digunakan jika pengguna memberikan konfirmasi data yang akan ditandatangani menggunakan token persetujuan. Untuk mengetahui informasi selengkapnya tentang cara mendapatkan konfirmasi pengguna, lihat Konfirmasi Dilindungi oleh Android.

Catatan: Tag ini hanya berlaku untuk kunci yang menggunakan tujuan SIGN.

unlockedDeviceRequired

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::UNLOCKED_DEVICE_REQUIRED, yang menggunakan nilai ID tag 509.

allApplications

Sesuai dengan tag otorisasi Tag::ALL_APPLICATIONS, yang menggunakan nilai ID tag 600.

Menunjukkan apakah semua aplikasi pada perangkat bisa mengakses pasangan kunci.

applicationId
Sesuai dengan tag otorisasi Tag::APPLICATION_ID, yang menggunakan nilai ID tag 601.
creationDateTime
Sesuai dengan tag otorisasi Tag::CREATION_DATETIME, yang menggunakan nilai ID tag 701.
origin

Sesuai dengan tag otorisasi Tag::ORIGIN, yang menggunakan nilai ID tag 702.

rollbackResistant

Hanya ada di pengesahan kunci versi 1 dan 2.

Sesuai dengan tag otorisasi Tag::ROLLBACK_RESISTANT, yang menggunakan nilai ID tag 703.

rootOfTrust

Sesuai dengan tag otorisasi Tag::ROOT_OF_TRUST, yang menggunakan nilai ID tag 704.

Untuk mengetahui detail selengkapnya, lihat bagian yang menjelaskan struktur data RootOfTrust.

osVersion

Sesuai dengan tag otorisasi Tag::OS_VERSION, yang menggunakan nilai ID tag 705.

Versi sistem operasi Android yang berhubungan dengan Keymaster, ditetapkan sebagai bilangan bulat enam digit. Misalnya, versi 8.1.0 ditampilkan sebagai 080100.

Hanya Keymaster versi 1.0 atau lebih tinggi yang memasukkan nilai ini dalam daftar otorisasi.

osPatchLevel

Sesuai dengan tag otorisasi Tag::PATCHLEVEL, yang menggunakan nilai ID tag 706.

Bulan dan tahun yang terkait dengan patch keamanan yang digunakan dalam Keymaster, ditetapkan sebagai bilangan bulat enam digit. Misalnya, patch Agustus 2018 ditampilkan sebagai 201808.

Hanya Keymaster versi 1.0 atau lebih tinggi yang memasukkan nilai ini dalam daftar otorisasi.

attestationApplicationId

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Keymaster Tag::ATTESTATION_APPLICATION_ID, yang menggunakan nilai ID tag 709.

Untuk mengetahui detail selengkapnya, lihat bagian yang menjelaskan struktur data AttestationApplicationId.

attestationIdBrand

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag Keymaster Tag::ATTESTATION_ID_BRAND, yang menggunakan nilai ID tag 710.

attestationIdDevice

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag Keymaster Tag::ATTESTATION_ID_DEVICE, yang menggunakan nilai ID tag 711.

attestationIdProduct

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag Keymaster Tag::ATTESTATION_ID_PRODUCT, yang menggunakan nilai ID tag 712.

attestationIdSerial

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag Keymaster Tag::ATTESTATION_ID_SERIAL, yang menggunakan nilai ID tag 713.

attestationIdImei

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_IMEI, yang menggunakan nilai ID tag 714.

attestationIdMeid

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_MEID, yang menggunakan nilai ID tag 715.

attestationIdManufacturer

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_MANUFACTURER, yang menggunakan nilai ID tag 716.

attestationIdModel

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_MODEL, yang menggunakan nilai ID tag 717.

vendorPatchLevel

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::VENDOR_PATCHLEVEL, yang menggunakan nilai ID tag 718.

Menentukan level patch keamanan image vendor yang harus diinstal pada perangkat agar kunci ini dapat digunakan. Nilai muncul dalam format YYYYMMDD, yang menampilkan tanggal patch keamanan vendor. Misalnya, jika kunci dibuat pada perangkat Android dengan patch keamanan vendor 1 Agustus 2018 terinstal, nilainya adalah 20180801.

bootPatchLevel

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::BOOT_PATCHLEVEL, yang menggunakan nilai ID tag 719.

Menentukan level patch keamanan image kernel yang harus diinstal pada perangkat agar kunci ini dapat digunakan. Nilai muncul dalam format YYYYMMDD, yang menampilkan tanggal patch keamanan sistem. Misalnya, jika kunci dibuat pada perangkat Android dengan patch keamanan sistem 5 Agustus 2018 terinstal, nilainya adalah 20180805.

deviceUniqueAttestation

Hanya ada di pengesahan kunci versi >= 4.

Sesuai dengan tag otorisasi Tag::DEVICE_UNIQUE_ATTESTATION, yang menggunakan nilai ID tag 720.

RootOfTrust

Kumpulan nilai ini menjelaskan informasi penting tentang status perangkat.

Setiap bidang dalam daftar berikut bersifat wajib:

verifiedBootKey

Hash aman dari kunci yang memverifikasi image sistem. Disarankan agar Anda menggunakan algoritme SHA-256 untuk hash ini.

deviceLocked
Benar jika bootloader perangkat terkunci, yang memungkinkan Booting Terverifikasi memeriksa dan mencegah image perangkat yang tidak terdaftar tidak di-flash ke perangkat. Untuk mengetahui informasi selengkapnya tentang fitur ini, lihat dokumentasi Booting Terverifikasi.
verifiedBootState
Status booting perangkat, sesuai dengan fitur booting Terverifikasi.
verifiedBootHash

Hanya ada di pengesahan kunci versi 3.

Ringkasan semua data yang dilindungi oleh Booting Terverifikasi. Untuk perangkat yang menggunakan implementasi Booting Terverifikasi Android, nilai ini berisi ringkasan VBMeta struct, atau struktur metadata Booting Terverifikasi.

Untuk mempelajari lebih lanjut cara menghitung nilai ini, lihat The VBMeta Digest.

VerifiedBootState

Struktur data ini memberikan status booting perangkat saat ini, yang menampilkan level perlindungan yang diberikan ke pengguna dan aplikasi setelah perangkat menyelesaikan booting. Untuk mengetahui informasi selengkapnya tentang fitur ini, lihat bagian Status Booting dalam dokumentasi Booting Terverifikasi.

Struktur data ini berupa enumerasi, jadi struktur ini secara tepat menggunakan salah satu nilai berikut:

Telah Diverifikasi

Menunjukkan rantai kepercayaan lengkap, yang meliputi bootloader, partisi booting, dan semua partisi terverifikasi.

Jika perangkat dalam status booting, verifiedBootKey merupakan hash sertifikat yang disematkan pada perangkat, yang ditambahkan oleh produsen perangkat ke ROM perangkat di pabrik.

SelfSigned

Menunjukkan bahwa sertifikat yang disematkan pada perangkat telah memverifikasi partisi booting perangkat dan bahwa tanda tangan tersebut valid.

Ketika perangkat dalam keadaan booting, verifiedBootKey merupakan hash sertifikat yang diinstal pengguna, yang menandatangani partisi booting yang ditambahkan pengguna ke perangkat sebagai pengganti partisi booting asli, yang disediakan oleh produsen.

Belum diverifikasi
Menunjukkan bahwa pengguna dapat memodifikasi perangkat dengan leluasa. Oleh karena itu, pengguna bertanggung jawab untuk memverifikasi integritas perangkat.
Gagal
Menunjukkan bahwa perangkat gagal diverifikasi. Sertifikat pengesahan tidak boleh menggunakan nilai ini untuk VerifiedBootState.

AttestationApplicationId

Struktur data ini mencerminkan keyakinan platform Android terhadap aplikasi mana yang diizinkan untuk menggunakan materi kunci rahasia dalam pengesahan. ID dapat terdiri dari beberapa paket jika dan hanya jika beberapa paket memiliki UID yang sama. String octet itu sendiri diformat sesuai dengan skema ASN.1 berikut:

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

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
Serangkaian objek AttestationPackageInfo, yang masing-masing memberikan nama paket dan nomor versi.
signature_digests

Serangkaian ringkasan SHA-256 dari sertifikat penandatanganan aplikasi. Satu aplikasi dapat memiliki beberapa rantai sertifikat kunci penandatanganan. Untuk setiap rantai, sertifikat entitas akhir diringkas dan ditempatkan di kolom signature_digests. Nama kolom ini menyesatkan karena data yang diringkas adalah sertifikat penandatanganan aplikasi, bukan tanda tangan aplikasi, karena diberi nama untuk Signature class yang ditampilkan lewat panggilan ke getPackageInfo(). Cuplikan kode berikut menunjukkan kumpulan contoh:

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

Skema data ekstensi informasi penyediaan

Ekstensi informasi penyediaan memiliki 1.3.6.1.4.1.11129.2.1.30 OID. Ekstensi memberikan informasi yang diketahui tentang perangkat oleh server penyediaan. Ekstensi ini mengikuti skema CDDL.

  {
        1 : int,   ; certificates issued
  }

Peta ini dibatalkan versinya dan kolom opsional baru mungkin ditambahkan.

certs_issued

Perkiraan jumlah sertifikat yang diterbitkan untuk perangkat dalam 30 hari terakhir. Nilai ini dapat digunakan sebagai sinyal untuk potensi penyalahgunaan jika nilai ini lebih besar dari rata-rata berdasarkan beberapa urutan magnitudo.