ยืนยันคู่คีย์แบบใช้ฮาร์ดแวร์ด้วยเอกสารรับรองคีย์

การรับรองคีย์ช่วยให้คุณมั่นใจมากขึ้นว่าคีย์ที่คุณใช้ในแอปได้รับการจัดเก็บไว้ในคีย์สโตร์ที่รองรับฮาร์ดแวร์ของอุปกรณ์ ส่วนต่อไปนี้จะอธิบายวิธียืนยันคุณสมบัติของคีย์ที่เก็บไว้ในฮาร์ดแวร์และวิธีตีความข้อมูลส่วนขยายของใบรับรองการรับรอง

หมายเหตุ: ก่อนที่จะยืนยันพร็อพเพอร์ตี้ของคีย์ที่สำรองข้อมูลด้วยฮาร์ดแวร์ของอุปกรณ์ในสภาพแวดล้อมระดับเวอร์ชันที่ใช้งานจริง โปรดตรวจสอบว่าอุปกรณ์รองรับการรับรองคีย์ระดับฮาร์ดแวร์ โดยตรวจสอบว่าเชนใบรับรองการรับรองมีใบรับรองรูทที่ลงนามด้วยคีย์รูทการรับรองของ Google และองค์ประกอบ attestationSecurityLevel ภายในโครงสร้างข้อมูลคําอธิบายคีย์ได้รับการตั้งค่าเป็นระดับความปลอดภัย TrustedEnvironment หรือระดับความปลอดภัย StrongBox

นอกจากนี้ คุณควรตรวจสอบลายเซ็นในเชนใบรับรอง และยืนยันว่าไม่มีคีย์ใดในเชนที่ถูกเพิกถอนโดยดูรายการสถานะการเพิกถอนใบรับรอง อย่าเชื่อถือการรับรองอย่างเต็มรูปแบบ เว้นแต่ว่าคีย์ทั้งหมดจะถูกต้องและรูทเป็นคีย์รูทของ Google อย่างไรก็ตาม โปรดทราบว่าอุปกรณ์ที่มีใบรับรองที่เพิกถอนแล้วจะยังเชื่อถือได้เท่ากับอุปกรณ์ที่รองรับเฉพาะเอกสารรับรองซอฟต์แวร์เท่านั้น การรับรองที่ถูกต้องทั้งหมดเป็นตัวบ่งชี้เชิงบวกที่ชัดเจน การไม่มีข้อมูลดังกล่าวเป็นสัญญาณที่เป็นกลาง ไม่ใช่เชิงลบ

เรียกข้อมูลและยืนยันคู่คีย์แบบใช้ฮาร์ดแวร์

ในระหว่างการรับรองคีย์ คุณจะระบุชื่อแทนของคู่คีย์และดึงข้อมูลเชนใบรับรองของคู่คีย์ดังกล่าว ซึ่งคุณใช้เพื่อยืนยันพร็อพเพอร์ตี้ของคู่คีย์นั้นได้

หากอุปกรณ์รองรับเอกสารรับรองคีย์ระดับฮาร์ดแวร์ ใบรับรองรูทภายในเชนนี้จะลงนามโดยใช้คีย์รูทของเอกสารรับรองที่จัดสรรให้กับคีย์สโตร์ที่อาศัยฮาร์ดแวร์ของอุปกรณ์อย่างปลอดภัย

หมายเหตุ: ในอุปกรณ์ที่จัดส่งพร้อมเอกสารรับรองคีย์ระดับฮาร์ดแวร์, Android 7.0 (API ระดับ 24) ขึ้นไป และบริการ Google Play ใบรับรองรูทจะลงนามด้วยคีย์รูทของเอกสารรับรองของ Google ยืนยันว่าใบรับรองรูทนี้อยู่ในรายการที่แสดงในส่วนใบรับรองรูท

หากต้องการใช้เอกสารรับรองคีย์ ให้ทำตามขั้นตอนต่อไปนี้

  1. ใช้KeyStore ของออบเจ็กต์ getCertificateChain() เพื่อทำเครื่องหมายอ้างอิงเชนใบรับรอง X.509 ที่เชื่อมโยงกับที่เก็บคีย์ที่รองรับฮาร์ดแวร์
  2. ส่งใบรับรองไปยังเซิร์ฟเวอร์แยกต่างหากที่คุณเชื่อถือเพื่อตรวจสอบ

    ข้อควรระวัง: อย่าทำตามขั้นตอนการตรวจสอบต่อไปนี้ให้เสร็จสมบูรณ์ในอุปกรณ์เดียวกันกับ KeyStore หากระบบ Android ในอุปกรณ์ดังกล่าวถูกบุกรุก กระบวนการตรวจสอบอาจเชื่อถือสิ่งที่ไม่น่าเชื่อถือ

  3. รับการอ้างอิงถึงไลบรารีการแยกวิเคราะห์และการตรวจสอบความถูกต้องของห่วงโซ่ใบรับรอง X.509 ที่เหมาะสำหรับชุดเครื่องมือของคุณมากที่สุด ยืนยันว่าใบรับรองสาธารณะรูทเชื่อถือได้และใบรับรองแต่ละใบลงนามในใบรับรองถัดไปในเชน

  4. ตรวจสอบสถานะการเพิกถอนของใบรับรองแต่ละใบเพื่อให้แน่ใจว่าไม่มีใบรับรองใดถูกเพิกถอน

  5. (ไม่บังคับ) ตรวจสอบส่วนขยายใบรับรองข้อมูลการจัดสรรที่จะปรากฏในชุดใบรับรองที่ใหม่กว่าเท่านั้น

    รับข้อมูลอ้างอิงไปยังไลบรารีโปรแกรมแยกวิเคราะห์ CBOR ที่เหมาะกับชุดเครื่องมือของคุณมากที่สุด ค้นหาใบรับรองที่ใกล้กับรูทที่สุดซึ่งมีส่วนขยายใบรับรองการจัดสรรข้อมูล ใช้โปรแกรมแยกวิเคราะห์เพื่อดึงข้อมูลส่วนขยายใบรับรองข้อมูลการจัดสรรจากใบรับรองนั้น

    ดูรายละเอียดเพิ่มเติมได้ที่ส่วนเกี่ยวกับสคีมาข้อมูลส่วนขยายข้อมูลการจัดสรร

  6. รับข้อมูลอ้างอิงเกี่ยวกับไลบรารีโปรแกรมแยกวิเคราะห์ ASN.1 ที่เหมาะกับชุดเครื่องมือของคุณมากที่สุด ค้นหาใบรับรองที่ใกล้กับรูทที่สุดซึ่งมีส่วนขยายใบรับรองการรับรองคีย์ หากมีส่วนขยายใบรับรองข้อมูลการจัดสรร ส่วนขยายใบรับรองคีย์ดังกล่าวต้องอยู่ในใบรับรองถัดไปทันที ใช้โปรแกรมแยกวิเคราะห์เพื่อดึงข้อมูลส่วนขยายใบรับรองคีย์จากใบรับรองนั้น

    ข้อควรระวัง: อย่าคิดว่าส่วนขยายใบรับรองการรับรองคีย์อยู่ในใบรับรองใบสุดท้ายของเชน เฉพาะการปรากฏครั้งแรกของส่วนขยายในเชนเท่านั้นที่เชื่อถือได้ อินสแตนซ์อื่นๆ ของส่วนขยายไม่ได้ออกโดยฮาร์ดแวร์ที่ปลอดภัยและอาจมีการออกโดยผู้โจมตีที่ขยายเชนขณะพยายามสร้างเอกสารรับรองปลอมสำหรับคีย์ที่ไม่น่าเชื่อถือ

    ตัวอย่างการรับรองคีย์ใช้โปรแกรมแยกวิเคราะห์ 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 จะไม่อ้างสิทธิ์ใดๆ เกี่ยวกับความปลอดภัยของฮาร์ดแวร์ ซึ่งไม่ได้หมายความว่าคีย์ของคุณถูกบุกรุก แต่การรับรองไม่ได้พิสูจน์ว่าคีย์อยู่ในฮาร์ดแวร์ที่ปลอดภัย ปรับสมมติฐานด้านความปลอดภัยตามความเหมาะสม

หากใบรับรองรูทไม่มีคีย์สาธารณะในหน้านี้ สาเหตุที่เป็นไปได้มี 2 ประการดังนี้

  • เป็นไปได้ว่าอุปกรณ์เปิดตัวด้วย 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
}

ตัวอย่าง 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"
    }
  }
}

สคีมาข้อมูลของส่วนขยายเอกสารรับรองคีย์

ส่วนขยายการรับรองคีย์มี OID 1.3.6.1.4.1.11129.2.1.17 ส่วนขยายจะจัดเก็บข้อมูลตามสคีมา ASN.1

รายการต่อไปนี้แสดงคำอธิบายขององค์ประกอบแต่ละรายการภายในสคีมา

KeyDescription

ลําดับค่านี้แสดงข้อมูลทั่วไปเกี่ยวกับคู่คีย์ที่ยืนยันผ่านเอกสารรับรองคีย์ และช่วยให้เข้าถึงรายละเอียดเพิ่มเติมได้ง่ายๆ

attestationVersion
เวอร์ชันของฟีเจอร์การรับรองคีย์
ค่าเวอร์ชัน
1Keymaster เวอร์ชัน 2.0
2Keymaster เวอร์ชัน 3.0
3Keymaster เวอร์ชัน 4.0
4Keymaster เวอร์ชัน 4.1
100KeyMint เวอร์ชัน 1.0
200KeyMint เวอร์ชัน 2.0
300KeyMint เวอร์ชัน 3.0
attestationSecurityLevel

ระดับความปลอดภัยของเอกสารรับรอง

คำเตือน: แม้ว่าคุณจะรับรองคีย์ที่จัดเก็บไว้ในระบบ Android ได้ (นั่นคือ หากตั้งค่าค่าของ attestationSecurityLevel เป็น "ซอฟต์แวร์") แต่คุณก็ไม่สามารถเชื่อถือการรับรองเหล่านี้ได้หากระบบ Android ถูกบุกรุก

keymasterVersion / keyMintVersion
เวอร์ชันของระดับชั้นการจัดการฮาร์ดแวร์โดยตรง (HAL) ของ Keymaster หรือ KeyMint
ค่าเวอร์ชัน
0Keymaster เวอร์ชัน 0.2 หรือ 0.3
1Keymaster เวอร์ชัน 1.0
2Keymaster เวอร์ชัน 2.0
3Keymaster เวอร์ชัน 3.0
4Keymaster เวอร์ชัน 4.0
41Keymaster เวอร์ชัน 4.1
100KeyMint เวอร์ชัน 1.0
200KeyMint เวอร์ชัน 2.0
300KeyMint เวอร์ชัน 3.0
keymasterSecurityLevel / keyMintSecurityLevel
ระดับการรักษาความปลอดภัยของการติดตั้งใช้งาน Keymaster/KeyMint
attestationChallenge
มีภารกิจที่ระบุไว้เมื่อสร้างคีย์ ตรวจสอบว่าค่านี้ตรงกับค่าที่เซิร์ฟเวอร์ระบุตามที่จัดเก็บในแท็กการให้สิทธิ์ Tag::ATTESTATION_CHALLENGE หรือไม่ มิเช่นนั้น บริการของคุณอาจเสี่ยงต่อการบันทึกซ้ำของใบรับรองการรับรองแบบเก่า
uniqueId
ค่านี้จะระบุอุปกรณ์ แต่จะใช้ได้ในช่วงระยะเวลาที่จำกัดเท่านั้น โดยระบบจะคํานวณและจะใช้โดยแอประบบเท่านั้น ในแอปอื่นๆ ทั้งหมด uniqueId จะว่างเปล่า
softwareEnforced
ไม่บังคับ รายการการให้สิทธิ์ Keymaster / KeyMint ที่บังคับใช้โดยระบบ Android ไม่ใช่โดย Trusted Execution Environment (TEE) ของอุปกรณ์ ข้อมูลในรายการการให้สิทธิ์นี้จะรวบรวมหรือสร้างโดยโค้ดที่เป็นส่วนหนึ่งของแพลตฟอร์มและจัดเก็บไว้ในพาร์ติชันระบบของอุปกรณ์ เนื้อหาของรายการการให้สิทธิ์นี้เชื่อถือได้ตราบใดที่อุปกรณ์ใช้ระบบปฏิบัติการที่เป็นไปตามรูปแบบความปลอดภัยของแพลตฟอร์ม Android อุปกรณ์ Android ที่ได้รับการรับรองทั้งหมดเป็นไปตามโมเดลความปลอดภัยนี้ ดังนั้นหากอุปกรณ์ล็อกอยู่และสถานะการเปิดเครื่องที่ได้รับการยืนยันคือ Verified ค่าที่นี่ควรเชื่อถือได้ ในอุปกรณ์ที่ดัดแปลงซึ่งมีการปลดล็อก Bootloader ผู้ใช้จะติดตั้งระบบปฏิบัติการที่ไม่สอดคล้องกับโมเดลความปลอดภัยของแพลตฟอร์ม Android ได้ ดังนั้นผู้ใช้อาจเลือกค่าในช่องนี้โดยไม่มีกฎเกณฑ์ตายตัว
hardwareEnforced
ไม่บังคับ รายการการให้สิทธิ์ Keymaster / KeyMint ที่บังคับใช้โดย Trusted Execution Environment (TEE) ของอุปกรณ์ ข้อมูลในรายการการให้สิทธิ์นี้รวบรวมหรือสร้างขึ้นโดยโค้ดที่เป็นส่วนหนึ่งของฮาร์ดแวร์ที่มีความปลอดภัย และแพลตฟอร์มไม่ได้ควบคุม ตัวอย่างเช่น ข้อมูลในรายการการให้สิทธิ์นี้มาจาก Bootloader ของอุปกรณ์หรือ TEE ที่ทำงานในอุปกรณ์ ช่องในรายการการให้สิทธิ์นี้ที่ KeyMint ไม่ได้เป็นผู้ตั้งค่าโดยตรงจะมาจากส่วนอื่นๆ ของฮาร์ดแวร์ที่มีความปลอดภัย (เช่น บูตโหลดเดอร์) ผ่านช่องทางการสื่อสารที่ปลอดภัยซึ่งไม่เกี่ยวข้องกับการเชื่อถือแพลตฟอร์ม ความแตกต่างระหว่างฮาร์ดแวร์ที่ปลอดภัยกับระบบ Android คือผู้ใช้ไม่สามารถแก้ไขโค้ดที่ทำงานในฮาร์ดแวร์ที่ปลอดภัย (เฟิร์มแวร์) ดังนั้นผู้ใช้จึงไม่สามารถลบล้างค่าในรายการการให้สิทธิ์ได้

ระดับการรักษาความปลอดภัย

โครงสร้างข้อมูลนี้ระบุระดับการปกป้องฟีเจอร์ซอฟต์แวร์ เช่น คู่คีย์ โดยอิงตามตำแหน่งภายในอุปกรณ์

เนื่องจากโครงสร้างข้อมูลเป็นการแจกแจงค่า จึงใช้ค่าใดค่าหนึ่งต่อไปนี้ได้เท่านั้น

คีย์สโตร์
ระบบจะใช้ตรรกะในการสร้างและจัดการฟีเจอร์ในระบบ Android ในการสร้างและจัดเก็บคู่คีย์ ตำแหน่งนี้มีความปลอดภัยน้อยกว่า TEE แต่ปลอดภัยกว่าพื้นที่การประมวลผลของแอป
TrustedEnvironment
ระบบจะใช้ตรรกะในการสร้างและจัดการฟีเจอร์ในฮาร์ดแวร์ที่ปลอดภัย เช่น TEE ตำแหน่งนี้ปลอดภัยกว่าสำหรับการสร้างและจัดเก็บคู่คีย์ เนื่องจากฮาร์ดแวร์ที่มีความปลอดภัยสามารถป้องกันการประนีประนอมจากระยะไกลได้
StrongBox
ตรรกะในการสร้างและจัดการฟีเจอร์นี้จะใช้ในโมดูลความปลอดภัยฮาร์ดแวร์โดยเฉพาะ ตำแหน่งนี้ปลอดภัยกว่าสำหรับการสร้างและจัดเก็บคู่คีย์ เนื่องจากมีความต้านทานสูงต่อการประนีประนอมจากระยะไกลและการโจมตีฮาร์ดแวร์ต่อโมดูล
ซอฟต์แวร์
ตรรกะสำหรับการสร้างและจัดการฟีเจอร์นี้จะมีการติดตั้งใช้งาน KeyMint หรือ Keymaster ที่ไม่ได้ทำงานในสภาพแวดล้อมที่ปลอดภัย ตำแหน่งนี้ไม่ปลอดภัยเท่า TEE แต่ปลอดภัยกว่าพื้นที่กระบวนการของแอปสำหรับการสร้างและจัดเก็บคู่คีย์

รายการการให้สิทธิ์

โครงสร้างข้อมูลนี้มีพร็อพเพอร์ตี้ของคู่คีย์เองตามที่กําหนดไว้ในเลเยอร์ Abstraction ของฮาร์ดแวร์ Keymaster หรือ KeyMint (HAL) คุณสามารถเปรียบเทียบค่าเหล่านี้กับสถานะปัจจุบันของอุปกรณ์หรือชุดค่าที่คาดไว้เพื่อยืนยันว่าคู่คีย์ยังคงใช้งานได้ในแอป

ชื่อช่องแต่ละรายการจะสอดคล้องกับแท็กการให้สิทธิ์ Keymaster / KeyMint ที่มีชื่อคล้ายกัน เช่น ช่อง keySize ในรายการการให้สิทธิ์จะสอดคล้องกับแท็กการให้สิทธิ์ Tag::KEY_SIZE

ข้อกําหนดอินเทอร์เฟซ AIDL มีข้อมูลที่แน่นอนเกี่ยวกับแท็กการให้สิทธิ์ ซึ่งจะกำหนดค่ารหัสและประเภทของแท็กแต่ละรายการ รวมถึงระบุว่าระบบคาดหวังว่าแท็กแต่ละรายการจะอยู่ในhardwareEnforcedรายการการให้สิทธิ์ (บ่งบอกว่ามีการบังคับใช้แท็กในสภาพแวดล้อมที่ปลอดภัย) หรืออยู่ในsoftwareEnforcedรายการการให้สิทธิ์ (บ่งบอกว่า Android บังคับใช้แท็ก โดยปกติแล้วจะใช้คีย์สโตร์)

ช่องแต่ละช่องในรายการต่อไปนี้เป็นช่องที่ไม่บังคับ

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

หมายเหตุ: แท็กนี้ใช้กับคีย์ที่วัตถุประสงค์ 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 ซึ่งระบุเป็นจำนวนเต็ม 6 หลัก เช่น เวอร์ชัน 8.1.0 จะแสดงเป็น 080100

เฉพาะ Keymaster เวอร์ชัน 1.0 ขึ้นไปเท่านั้นที่จะรวมค่านี้ไว้ในรายการการให้สิทธิ์

osPatchLevel

สอดคล้องกับแท็กการให้สิทธิ์ Tag::PATCHLEVEL ซึ่งใช้ค่ารหัสแท็ก 706

เดือนและปีที่เชื่อมโยงกับแพตช์ความปลอดภัยที่ใช้ภายใน Keymaster ซึ่งระบุเป็นจำนวนเต็ม 6 หลัก เช่น การแก้ไขในเดือนสิงหาคม 2018 จะแสดงเป็น 201808

เฉพาะ Keymaster เวอร์ชัน 1.0 ขึ้นไปเท่านั้นที่จะรวมค่านี้ไว้ในรายการการให้สิทธิ์

attestationApplicationId

มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2

สอดคล้องกับแท็กการให้สิทธิ์ Keymaster Tag::ATTESTATION_APPLICATION_ID ซึ่งใช้ค่ารหัสแท็ก 709

ดูรายละเอียดเพิ่มเติมได้ที่ส่วนอธิบายโครงสร้างข้อมูล AttestationApplicationId

attestationIdBrand

มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2

สอดคล้องกับแท็ก Keymaster Tag::ATTESTATION_ID_BRAND ซึ่งใช้ค่ารหัสแท็ก 710

attestationIdDevice

แสดงเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2

สอดคล้องกับแท็ก Keymaster ของ Tag::ATTESTATION_ID_DEVICE ซึ่งใช้ค่ารหัสแท็ก 711

attestationIdProduct

มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2

สอดคล้องกับแท็ก Keymaster Tag::ATTESTATION_ID_PRODUCT ซึ่งใช้ค่ารหัสแท็กเป็น 712

attestationIdSerial

มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2

สอดคล้องกับแท็ก Keymaster ของ Tag::ATTESTATION_ID_SERIAL ซึ่งใช้ค่ารหัสแท็ก 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

RootOfTrust

ชุดค่าผสมนี้กำหนดข้อมูลสำคัญเกี่ยวกับสถานะของอุปกรณ์

ต้องระบุข้อมูลแต่ละช่องในรายการต่อไปนี้

verifiedBootKey

แฮชที่ปลอดภัยของคีย์ที่ยืนยันอิมเมจระบบ เราขอแนะนำให้ใช้อัลกอริทึม SHA-256 สำหรับการแฮชนี้

deviceLocked
จริงหาก Bootloader ของอุปกรณ์ล็อกอยู่ ซึ่งจะเปิดใช้การตรวจสอบการเปิดเครื่องที่ได้รับการยืนยันและป้องกันการแฟลชอิมเมจของอุปกรณ์ที่ไม่ได้ลงชื่อไปยังอุปกรณ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์นี้ได้ในเอกสารการยืนยัน
verifiedBootState
สถานะการเปิดเครื่องของอุปกรณ์ตามฟีเจอร์การเปิดเครื่องที่ได้รับการยืนยัน
verifiedBootHash

มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 3

ข้อมูลสรุปทั้งหมดที่ได้รับการปกป้องโดยการบูตที่ผ่านการยืนยัน สำหรับอุปกรณ์ที่ใช้การเปิดเครื่องที่ได้รับการยืนยันของ Android Verified Boot ค่านี้จะมีข้อมูลสรุปของ VBMeta struct หรือโครงสร้างข้อมูลเมตาของการเปิดเครื่องที่ได้รับการยืนยัน

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีคํานวณค่านี้ได้ที่สรุป VBMeta

VerifiedBootState

โครงสร้างข้อมูลนี้จะแสดงสถานะการบูตปัจจุบันของอุปกรณ์ ซึ่งแสดงถึงระดับการป้องกันที่มอบให้แก่ผู้ใช้และแอปหลังจากที่อุปกรณ์บูตเสร็จแล้ว ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์นี้ได้ที่ส่วน สถานะการเปิดเครื่องในเอกสารประกอบการเปิดเครื่องที่ยืนยัน

โครงสร้างข้อมูลนี้เป็นการจัดหมวดหมู่ ดังนั้นจึงใช้ค่าใดค่าหนึ่งต่อไปนี้ได้เท่านั้น

ยืนยันแล้ว

บ่งบอกถึงเชนความน่าเชื่อถือแบบเต็ม ซึ่งรวมถึงบูตโหลดเดอร์ พาร์ติชันสำหรับบูต และแอปเพล็ตที่ยืนยันแล้วทั้งหมด

เมื่ออุปกรณ์อยู่ในสถานะการบูตนี้ verifiedBootKey จะเป็นแฮชของใบรับรองที่ฝังอยู่ในอุปกรณ์ ซึ่งผู้ผลิตอุปกรณ์เพิ่มลงใน ROM ของอุปกรณ์ที่โรงงาน

SelfSigned

บ่งบอกว่าใบรับรองที่ฝังอยู่ในอุปกรณ์ได้ยืนยันพาร์ติชันสำหรับบูตของอุปกรณ์และลายเซ็นถูกต้อง

เมื่ออุปกรณ์อยู่ในสถานะเปิดเครื่องนี้ verifiedBootKey คือแฮชของใบรับรองที่ผู้ใช้ติดตั้ง ซึ่งจะรับรองพาร์ติชันการเปิดเครื่องที่ผู้ใช้เพิ่มลงในอุปกรณ์แทนพาร์ติชันบูตเดิมที่ผู้ผลิตมีให้

ไม่ได้ยืนยัน
บ่งบอกว่าผู้ใช้สามารถแก้ไขอุปกรณ์ได้อย่างอิสระ ดังนั้น ผู้ใช้จึงมีหน้าที่รับผิดชอบในการยืนยันความสมบูรณ์ของอุปกรณ์
ไม่สำเร็จ
บ่งบอกว่าอุปกรณ์ยืนยันไม่สำเร็จ ใบรับรองของเอกสารรับรองไม่ควรใช้ค่านี้สำหรับ VerifiedBootState

AttestationApplicationId

โครงสร้างข้อมูลนี้สะท้อนให้เห็นถึงความเชื่อของแพลตฟอร์ม 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 แต่ละรายการจะมีชื่อและหมายเลขเวอร์ชันของแพ็กเกจ
signature_digests

ชุดข้อมูลสรุป SHA-256 ของใบรับรองการรับรองของแอป แอปหนึ่งมีเชนใบรับรองคีย์ Signing ได้หลายรายการ ระบบจะแยกวิเคราะห์ใบรับรอง "ใบไม้" แต่ละใบและวางไว้ในช่อง 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 วันที่ผ่านมา ค่านี้สามารถใช้เป็นสัญญาณที่บ่งบอกถึงการละเมิดที่อาจเกิดขึ้นได้หากค่าสูงกว่าค่าเฉลี่ยหลายเท่า