การรับรองคีย์ช่วยให้คุณมั่นใจมากขึ้นว่าคีย์ที่คุณใช้ในแอปได้รับการจัดเก็บไว้ในคีย์สโตร์ที่รองรับฮาร์ดแวร์ของอุปกรณ์ ส่วนต่อไปนี้จะอธิบายวิธียืนยันคุณสมบัติของคีย์ที่เก็บไว้ในฮาร์ดแวร์และวิธีตีความข้อมูลส่วนขยายของใบรับรองการรับรอง
หมายเหตุ: ก่อนที่จะยืนยันพร็อพเพอร์ตี้ของคีย์ที่สำรองข้อมูลด้วยฮาร์ดแวร์ของอุปกรณ์ในสภาพแวดล้อมระดับเวอร์ชันที่ใช้งานจริง โปรดตรวจสอบว่าอุปกรณ์รองรับการรับรองคีย์ระดับฮาร์ดแวร์ โดยตรวจสอบว่าเชนใบรับรองการรับรองมีใบรับรองรูทที่ลงนามด้วยคีย์รูทการรับรองของ Google และองค์ประกอบ attestationSecurityLevel
ภายในโครงสร้างข้อมูลคําอธิบายคีย์ได้รับการตั้งค่าเป็นระดับความปลอดภัย TrustedEnvironment
หรือระดับความปลอดภัย StrongBox
นอกจากนี้ คุณควรตรวจสอบลายเซ็นในเชนใบรับรอง และยืนยันว่าไม่มีคีย์ใดในเชนที่ถูกเพิกถอนโดยดูรายการสถานะการเพิกถอนใบรับรอง อย่าเชื่อถือการรับรองอย่างเต็มรูปแบบ เว้นแต่ว่าคีย์ทั้งหมดจะถูกต้องและรูทเป็นคีย์รูทของ Google อย่างไรก็ตาม โปรดทราบว่าอุปกรณ์ที่มีใบรับรองที่เพิกถอนแล้วจะยังเชื่อถือได้เท่ากับอุปกรณ์ที่รองรับเฉพาะเอกสารรับรองซอฟต์แวร์เท่านั้น การรับรองที่ถูกต้องทั้งหมดเป็นตัวบ่งชี้เชิงบวกที่ชัดเจน การไม่มีข้อมูลดังกล่าวเป็นสัญญาณที่เป็นกลาง ไม่ใช่เชิงลบ
เรียกข้อมูลและยืนยันคู่คีย์แบบใช้ฮาร์ดแวร์
ในระหว่างการรับรองคีย์ คุณจะระบุชื่อแทนของคู่คีย์และดึงข้อมูลเชนใบรับรองของคู่คีย์ดังกล่าว ซึ่งคุณใช้เพื่อยืนยันพร็อพเพอร์ตี้ของคู่คีย์นั้นได้
หากอุปกรณ์รองรับเอกสารรับรองคีย์ระดับฮาร์ดแวร์ ใบรับรองรูทภายในเชนนี้จะลงนามโดยใช้คีย์รูทของเอกสารรับรองที่จัดสรรให้กับคีย์สโตร์ที่อาศัยฮาร์ดแวร์ของอุปกรณ์อย่างปลอดภัย
หมายเหตุ: ในอุปกรณ์ที่จัดส่งพร้อมเอกสารรับรองคีย์ระดับฮาร์ดแวร์, Android 7.0 (API ระดับ 24) ขึ้นไป และบริการ Google Play ใบรับรองรูทจะลงนามด้วยคีย์รูทของเอกสารรับรองของ Google ยืนยันว่าใบรับรองรูทนี้อยู่ในรายการที่แสดงในส่วนใบรับรองรูท
หากต้องการใช้เอกสารรับรองคีย์ ให้ทำตามขั้นตอนต่อไปนี้
-
ใช้
KeyStore
ของออบเจ็กต์getCertificateChain()
เพื่อทำเครื่องหมายอ้างอิงเชนใบรับรอง X.509 ที่เชื่อมโยงกับที่เก็บคีย์ที่รองรับฮาร์ดแวร์ -
ส่งใบรับรองไปยังเซิร์ฟเวอร์แยกต่างหากที่คุณเชื่อถือเพื่อตรวจสอบ
ข้อควรระวัง: อย่าทำตามขั้นตอนการตรวจสอบต่อไปนี้ให้เสร็จสมบูรณ์ในอุปกรณ์เดียวกันกับ KeyStore หากระบบ Android ในอุปกรณ์ดังกล่าวถูกบุกรุก กระบวนการตรวจสอบอาจเชื่อถือสิ่งที่ไม่น่าเชื่อถือ
-
รับการอ้างอิงถึงไลบรารีการแยกวิเคราะห์และการตรวจสอบความถูกต้องของห่วงโซ่ใบรับรอง X.509 ที่เหมาะสำหรับชุดเครื่องมือของคุณมากที่สุด ยืนยันว่าใบรับรองสาธารณะรูทเชื่อถือได้และใบรับรองแต่ละใบลงนามในใบรับรองถัดไปในเชน
-
ตรวจสอบสถานะการเพิกถอนของใบรับรองแต่ละใบเพื่อให้แน่ใจว่าไม่มีใบรับรองใดถูกเพิกถอน
-
(ไม่บังคับ) ตรวจสอบส่วนขยายใบรับรองข้อมูลการจัดสรรที่จะปรากฏในชุดใบรับรองที่ใหม่กว่าเท่านั้น
รับข้อมูลอ้างอิงไปยังไลบรารีโปรแกรมแยกวิเคราะห์ CBOR ที่เหมาะกับชุดเครื่องมือของคุณมากที่สุด ค้นหาใบรับรองที่ใกล้กับรูทที่สุดซึ่งมีส่วนขยายใบรับรองการจัดสรรข้อมูล ใช้โปรแกรมแยกวิเคราะห์เพื่อดึงข้อมูลส่วนขยายใบรับรองข้อมูลการจัดสรรจากใบรับรองนั้น
ดูรายละเอียดเพิ่มเติมได้ที่ส่วนเกี่ยวกับสคีมาข้อมูลส่วนขยายข้อมูลการจัดสรร
-
รับข้อมูลอ้างอิงเกี่ยวกับไลบรารีโปรแกรมแยกวิเคราะห์ ASN.1 ที่เหมาะกับชุดเครื่องมือของคุณมากที่สุด ค้นหาใบรับรองที่ใกล้กับรูทที่สุดซึ่งมีส่วนขยายใบรับรองการรับรองคีย์ หากมีส่วนขยายใบรับรองข้อมูลการจัดสรร ส่วนขยายใบรับรองคีย์ดังกล่าวต้องอยู่ในใบรับรองถัดไปทันที ใช้โปรแกรมแยกวิเคราะห์เพื่อดึงข้อมูลส่วนขยายใบรับรองคีย์จากใบรับรองนั้น
ข้อควรระวัง: อย่าคิดว่าส่วนขยายใบรับรองการรับรองคีย์อยู่ในใบรับรองใบสุดท้ายของเชน เฉพาะการปรากฏครั้งแรกของส่วนขยายในเชนเท่านั้นที่เชื่อถือได้ อินสแตนซ์อื่นๆ ของส่วนขยายไม่ได้ออกโดยฮาร์ดแวร์ที่ปลอดภัยและอาจมีการออกโดยผู้โจมตีที่ขยายเชนขณะพยายามสร้างเอกสารรับรองปลอมสำหรับคีย์ที่ไม่น่าเชื่อถือ
ตัวอย่างการรับรองคีย์ใช้โปรแกรมแยกวิเคราะห์ ASN.1 จาก Bouncy Castle เพื่อดึงข้อมูลส่วนขยายของใบรับรองการรับรอง คุณสามารถใช้ตัวอย่างนี้เพื่อเป็นข้อมูลอ้างอิงในการสร้างโปรแกรมแยกวิเคราะห์ของคุณเอง
ดูรายละเอียดเพิ่มเติมได้ที่ส่วนสคีมาข้อมูลส่วนขยายการรับรอง
-
ตรวจสอบความสอดคล้องของข้อมูลส่วนขยายที่คุณดึงข้อมูลในขั้นตอนก่อนหน้า และเปรียบเทียบกับชุดค่าที่คุณคาดหวังว่าคีย์ที่สำรองข้อมูลด้วยฮาร์ดแวร์จะมี
ใบรับรองรูท
ความน่าเชื่อถือของการรับรองขึ้นอยู่กับใบรับรองรูทของเชน อุปกรณ์ 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-----
หากใบรับรองรูทในเชนการรับรองที่คุณได้รับมีคีย์สาธารณะนี้และไม่มีใบรับรองใดในเชนถูกเพิกถอน คุณจะทราบสิ่งต่อไปนี้
- คีย์ของคุณอยู่ในฮาร์ดแวร์ที่ Google เชื่อว่าปลอดภัย และ
- โดยมีพร็อพเพอร์ตี้ตามที่อธิบายไว้ในใบรับรองของเอกสารรับรอง
หากเชนการรับรองมีคีย์สาธารณะรูทอื่นๆ อยู่ 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
-
เวอร์ชันของฟีเจอร์การรับรองคีย์
ค่า เวอร์ชัน 1 Keymaster เวอร์ชัน 2.0 2 Keymaster เวอร์ชัน 3.0 3 Keymaster เวอร์ชัน 4.0 4 Keymaster เวอร์ชัน 4.1 100 KeyMint เวอร์ชัน 1.0 200 KeyMint เวอร์ชัน 2.0 300 KeyMint เวอร์ชัน 3.0 -
attestationSecurityLevel
-
ระดับความปลอดภัยของเอกสารรับรอง
คำเตือน: แม้ว่าคุณจะรับรองคีย์ที่จัดเก็บไว้ในระบบ Android ได้ (นั่นคือ หากตั้งค่าค่าของ
attestationSecurityLevel
เป็น "ซอฟต์แวร์") แต่คุณก็ไม่สามารถเชื่อถือการรับรองเหล่านี้ได้หากระบบ Android ถูกบุกรุก -
keymasterVersion
/keyMintVersion
-
เวอร์ชันของระดับชั้นการจัดการฮาร์ดแวร์โดยตรง (HAL) ของ Keymaster หรือ KeyMint
ค่า เวอร์ชัน 0 Keymaster เวอร์ชัน 0.2 หรือ 0.3 1 Keymaster เวอร์ชัน 1.0 2 Keymaster เวอร์ชัน 2.0 3 Keymaster เวอร์ชัน 3.0 4 Keymaster เวอร์ชัน 4.0 41 Keymaster เวอร์ชัน 4.1 100 KeyMint เวอร์ชัน 1.0 200 KeyMint เวอร์ชัน 2.0 300 KeyMint เวอร์ชัน 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 วันที่ผ่านมา ค่านี้สามารถใช้เป็นสัญญาณที่บ่งบอกถึงการละเมิดที่อาจเกิดขึ้นได้หากค่าสูงกว่าค่าเฉลี่ยหลายเท่า