Xác minh cặp khoá dựa trên phần cứng bằng chứng thực khoá

Chứng thực khoá giúp bạn yên tâm hơn khi các khoá bạn dùng trong ứng dụng được lưu trữ trong kho khoá dựa trên phần cứng của thiết bị. Những phần sau đây mô tả cách xác minh các thuộc tính của khoá dựa trên phần cứng và cách diễn giải dữ liệu của tiện ích chứng chỉ chứng thực.

Lưu ý: Trước khi bạn xác minh các thuộc tính của khoá dựa trên phần cứng trên thiết bị trong môi trường cấp sản xuất, hãy đảm bảo rằng thiết bị hỗ trợ quy trình chứng thực khoá ở cấp độ phần cứng. Để thực hiện việc này, hãy kiểm tra nhằm đảm bảo rằng chuỗi chứng chỉ chứng thực có chứa chứng chỉ gốc được ký bằng khoá gốc của chứng thực Google và phần tử attestationSecurityLevel trong cấu trúc dữ liệu mô tả khoá được đặt thành mức bảo mật TrustedEnvironment.

Ngoài ra, bạn cần xác minh các chữ ký trong chuỗi chứng chỉ và xác nhận rằng không có khoá nào trong chuỗi đã bị thu hồi bằng cách kiểm tra danh sách trạng thái thu hồi chứng chỉ. Trừ phi tất cả đều hợp lệ và gốc là khoá gốc của Google, đừng hoàn toàn tin tưởng vào việc chứng thực. Tuy nhiên, lưu ý rằng các thiết bị chứa chứng chỉ bị thu hồi chí ít là vẫn đáng tin cậy như các thiết bị chỉ hỗ trợ chứng thực phần mềm. Khi có chứng thực hoàn toàn hợp lệ thì đó là một chỉ báo tích cực và mạnh mẽ. Nếu chưa có thì đó là một chỉ báo bình thường chứ không phải là một chỉ báo tiêu cực.

Truy xuất và xác minh cặp khoá dựa trên phần cứng

Trong quá trình chứng thực khoá, bạn chỉ định email đại diện của một cặp khoá và truy xuất chuỗi chứng chỉ của cặp khoá đó. Bạn có thể sử dụng chuỗi chứng chỉ này để xác minh các thuộc tính của cặp khoá đó.

Nếu thiết bị hỗ trợ quy trình chứng thực khoá ở cấp độ phần cứng, thì chứng chỉ gốc trong chuỗi này sẽ được ký bằng một khoá gốc của chứng thực (được cấp phép an toàn cho kho khoá dựa trên phần cứng của thiết bị).

Lưu ý: Trên các thiết bị sở hữu chứng thực khoá ở cấp độ phần cứng, Android 7.0 (API cấp 24) trở lên và các dịch vụ Google Play, chứng chỉ gốc được ký bằng khoá gốc chứng thực của Google. Xác minh rằng chứng chỉ gốc này là một trong số các chứng chỉ được liệt kê trong phần về chứng chỉ gốc.

Để triển khai quy trình chứng thực khoá, hãy hoàn tất các bước sau:

  1. Sử dụng phương thức getCertificateChain() của đối tượng KeyStore để lấy thông tin tham chiếu đến chuỗi chứng chỉ X.509 liên kết với kho khoá dựa trên phần cứng.
  2. Gửi chứng chỉ đến một máy chủ riêng biệt mà bạn tin tưởng để xác thực.

    Thận trọng: Không thực hiện quy trình xác thực sau đây trên cùng một thiết bị như KeyStore. Nếu hệ thống Android trên thiết bị đó bị xâm phạm, điều này có thể khiến quy trình xác thực tin tưởng nội dung không đáng tin cậy.

  3. Lấy thông tin tham chiếu đến thư viện xác thực và phân tích cú pháp chuỗi chứng chỉ X.509 phù hợp nhất với bộ công cụ của bạn. Xác minh rằng chứng chỉ gốc công khai là đáng tin cậy và mỗi chứng chỉ sẽ ký chứng chỉ tiếp theo trong chuỗi.

  4. Kiểm tra trạng thái thu hồi của từng chứng chỉ để đảm bảo rằng không có chứng chỉ nào bị thu hồi.

  5. Bạn có thể tuỳ ý kiểm tra tiện ích chứng chỉ thông tin cấp phép chỉ có trong các chuỗi chứng chỉ mới.

    Lấy thông tin tham chiếu đến thư viện trình phân tích cú pháp CBOR phù hợp nhất với bộ công cụ của bạn. Tìm chứng chỉ gần với chứng chỉ gốc nhất có chứa tiện ích chứng chỉ thông tin cấp phép. Sử dụng trình phân tích cú pháp để trích xuất dữ liệu của tiện ích chứng chỉ thông tin cấp phép từ chứng chỉ đó.

    Hãy xem phần về giản đồ dữ liệu của tiện ích thông tin cấp phép để biết thêm thông tin.

  6. Lấy thông tin tham chiếu đến thư viện trình phân tích cú pháp ASN.1 phù hợp nhất với bộ công cụ của bạn. Tìm chứng chỉ gần với chứng chỉ gốc nhất có chứa tiện ích chứng chỉ chứng thực khoá. Nếu có tiện ích chứng chỉ thông tin cấp phép, thì tiện ích chứng chỉ chứng thực khoá phải có trong chứng chỉ ngay sau đó. Sử dụng trình phân tích cú pháp để trích xuất dữ liệu của tiện ích chứng chỉ chứng thực khoá từ chứng chỉ đó.

    Thận trọng: Đừng giả định rằng tiện ích chứng chỉ chứng thực khoá nằm trong leaf certificate của chuỗi. Chỉ có thể tin tưởng lần xuất hiện đầu tiên của tiện ích trong chuỗi. Mọi phiên bản tiếp theo của tiện ích chưa được phần cứng bảo mật phát hành và có thể đã bị kẻ tấn công mở rộng chuỗi phát hành trong khi tìm cách tạo chứng thực giả mạo cho các khoá không tin cậy.

    Mẫu Chứng thực khoá sử dụng trình phân tích cú pháp ASN.1 từ Bouncy Castle để trích xuất dữ liệu tiện ích của chứng chỉ chứng thực. Bạn có thể sử dụng mẫu này làm tài liệu tham khảo để tạo trình phân tích cú pháp của riêng mình.

    Hãy xem phần về giản đồ dữ liệu của tiện ích chứng thực khoá để biết thêm thông tin.

  7. Kiểm tra dữ liệu của tiện ích mà bạn đã truy xuất ở các bước trước để đảm bảo tính nhất quán và so sánh với tập hợp các giá trị mà bạn mong đợi có trong khoá dựa trên phần cứng.

Chứng chỉ gốc

Mức độ đáng tin cậy của quy trình chứng thực phụ thuộc vào chứng chỉ gốc của chuỗi. Các thiết bị Android (vượt qua quy trình kiểm tra) bắt buộc phải có bộ ứng dụng của Google, bao gồm cả Google Play và các thiết bị chạy bằng Android 7.0 (API cấp 24) trở lên phải sử dụng khoá chứng thực được ký bằng Chứng chỉ gốc chứng thực phần cứng của Google. Lưu ý rằng việc chứng thực là không bắt buộc cho đến Android 8.0 (API cấp 26). Sau đây là khoá gốc công khai:

  -----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-----
Chứng chỉ gốc đã phát hành trước đây
    -----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-----
  

Nếu chứng chỉ gốc trong chuỗi chứng thực mà bạn nhận được chứa khoá công khai này và không có chứng chỉ nào trong chuỗi đó bị thu hồi, thì có nghĩa rằng:

  1. Khoá của bạn nằm trong phần cứng mà Google cho là bảo mật; và
  2. Khoá này có các thuộc tính được mô tả trong chứng chỉ chứng thực.

Nếu chuỗi chứng thực có bất kỳ khoá gốc công khai nào khác, thì Google sẽ không đưa ra tuyên bố về tính bảo mật của phần cứng. Điều này không có nghĩa là khoá của bạn bị xâm phạm mà chỉ là quy trình chứng thực không chứng minh được khoá nằm trong phần cứng bảo mật. Hãy điều chỉnh các giả định mà bạn đưa ra về bảo mật sao cho phù hợp.

Việc chứng chỉ gốc không chứa khoá công khai có thể là vì một trong hai lý do sau:

  • Nhiều khả năng nhất là thiết bị chạy Android phiên bản dưới 7.0 và phiên bản này không hỗ trợ quy trình chứng thực phần cứng. Trong trường hợp này, Android có một cách triển khai quy trình chứng thực bằng phần mềm. Quy trình này tạo ra cùng một loại chứng chỉ chứng thực, nhưng được ký bằng một khoá cố định giá trị trong mã nguồn của Android. Vì khoá ký này không phải là khoá bí mật nên quy trình chứng thực có thể đã do kẻ tấn công tạo ra để giả vờ cung cấp phần cứng bảo mật.
  • Một lý do khác có thể là thiết bị đó không phải của Google Play. Trong trường hợp đó, nhà sản xuất thiết bị có thể tuỳ ý tạo chứng chỉ gốc riêng và đưa ra bất kỳ tuyên bố nào mà họ muốn về ý nghĩa của quá trình chứng thực. Hãy tham khảo tài liệu của nhà sản xuất thiết bị. Lưu ý rằng tại thời điểm viết bài này, Google không biết bất kỳ nhà sản xuất thiết bị nào đã thực hiện việc này.

Danh sách trạng thái thu hồi chứng chỉ

Khoá chứng thực có thể bị thu hồi vì một số lý do, bao gồm cả việc kẻ tấn công sử dụng sai hoặc có hành vi trích xuất đáng ngờ. Do đó, điều quan trọng là phải kiểm tra trạng thái của từng chứng chỉ trong chuỗi chứng thực dựa vào danh sách trạng thái thu hồi chứng chỉ (CRL) chính thức. Danh sách này do Google duy trì và xuất bản tại: https://android.googleapis.com/attestation/status. Tiêu đề Cache-Control trong phản hồi HTTP xác định tần suất kiểm tra các bản cập nhật. Vì vậy, bạn không cần phải có yêu cầu mạng cho mọi chứng chỉ đang được xác minh. URL này trả về một tệp JSON chứa trạng thái thu hồi của mọi chứng chỉ không có trạng thái hợp lệ và bình thường. Định dạng của tệp JSON tuân thủ định nghĩa về Giản đồ JSON (bản nháp 07) sau đây:

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

Ví dụ về 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 cũ

Các URL của CRL được nhúng trong chứng chỉ chứng thực cũ sẽ tiếp tục hoạt động. Chứng chỉ chứng thực mới không còn chứa phần mở rộng URL của CRL. Trạng thái của chứng chỉ cũ cũng có trong danh sách trạng thái chứng thực. Vì vậy, nhà phát triển có thể yên tâm chuyển sang sử dụng danh sách trạng thái chứng thực cho cả chứng chỉ mới và cũ. Ví dụ về cách xác minh chính xác các khoá chứng thực của Android có trong Mẫu Chứng thực khoá.

Giản đồ dữ liệu của tiện ích chứng thực khoá

Tiện ích chứng thực khoá có OID 1.3.6.1.4.1.11129.2.1.17. Tiện ích này lưu trữ thông tin theo giản đồ ASN.1. Để xem giản đồ tương ứng với phiên bản chứng thực mà bạn đang sử dụng, hãy chọn thẻ thích hợp trong danh sách giản đồ sau đây:

Phiên bản 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),
}

Phiên bản 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),
}

Phiên bản 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),
}

Phiên bản 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),
}

Phiên bản 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),
}

Phiên bản 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),
}

Danh sách sau đây trình bày nội dung mô tả về từng phần tử trong giản đồ:

KeyDescription

Trình tự này của các giá trị cho biết thông tin chung về cặp khoá đang được xác minh thông qua quy trình chứng thực khoá, đồng thời giúp bạn dễ dàng truy cập vào các thông tin bổ sung.

attestationVersion
Phiên bản của tính năng chứng thực khoá.
Giá trịPhiên bản
1Keymaster phiên bản 2.0
2Keymaster phiên bản 3.0
3Keymaster phiên bản 4.0
4Keymaster phiên bản 4.1
100KeyMint phiên bản 1.0
200KeyMint phiên bản 2.0
attestationSecurityLevel

Mức bảo mật của quy trình chứng thực.

Cảnh báo: Mặc dù có thể chứng thực các khoá được lưu trữ trong hệ thống Android, tức là nếu giá trị của attestationSecurityLevel được đặt thành Phần mềm, nhưng bạn không thể tin tưởng những chứng thực này khi hệ thống Android bị xâm phạm.

keymasterVersion / keyMintVersion
Phiên bản của lớp trừu tượng phần cứng (HAL) cho Keymaster hoặc KeyMint.
Giá trịPhiên bản
0Keymaster phiên bản 0.2 hoặc 0.3
1Keymaster phiên bản 1.0
2Keymaster phiên bản 2.0
3Keymaster phiên bản 3.0
4Keymaster phiên bản 4.0
41Keymaster phiên bản 4.1
100KeyMint phiên bản 1.0
200KeyMint phiên bản 2.0
keymasterSecurityLevel / keyMintSecurityLevel
Mức bảo mật của quy trình triển khai Keymaster/KeyMint.
attestationChallenge
Chứa thử thách được đưa ra tại thời điểm tạo khoá. Kiểm tra xem giá trị này có khớp với giá trị mà máy chủ của bạn cung cấp hay không, như được lưu trữ trong thẻ uỷ quyền Tag::ATTESTATION_CHALLENGE. Nếu không, dịch vụ của bạn có thể dễ phát lại các chứng chỉ chứng thực cũ.
uniqueId
Giá trị này giúp xác định thiết bị nhưng chỉ trong một khoảng thời gian giới hạn. Giá trị này được tính toán và chỉ dành cho các ứng dụng hệ thống. Trong tất cả các ứng dụng khác, uniqueId sẽ trống.
softwareEnforced
Không bắt buộc. Danh sách uỷ quyền Keymaster/KeyMint do hệ thống Android chứ không phải Môi trường thực thi đáng tin cậy (TEE) của thiết bị thực thi.
teeEnforced
Không bắt buộc. Danh sách uỷ quyền Keymaster/KeyMint do TEE của thiết bị thực thi.

SecurityLevel

Cấu trúc dữ liệu này cho biết mức độ được bảo vệ của một tính năng phần mềm (chẳng hạn như một cặp khoá) dựa trên vị trí của tính năng đó trên thiết bị.

Vì cấu trúc dữ liệu là một bản liệt kê, nên cấu trúc này sẽ nhận đúng một trong các giá trị sau:

Software
Logic để tạo và quản lý tính năng này được triển khai trong hệ thống Android. Để tạo và lưu trữ các cặp khoá, vị trí này kém an toàn hơn so với TEE nhưng an toàn hơn so với không gian xử lý của ứng dụng.
TrustedEnvironment
Logic để tạo và quản lý tính năng này được triển khai trong phần cứng bảo mật, chẳng hạn như TEE. Để tạo và lưu trữ các cặp khoá, vị trí này an toàn hơn vì phần cứng bảo mật có khả năng chống xâm phạm từ xa.
StrongBox
Logic để tạo và quản lý tính năng được triển khai trong mô-đun bảo mật phần cứng riêng. Để tạo và lưu trữ các cặp khoá, vị trí này an toàn hơn vì có khả năng chống xâm nhập từ xa và các cuộc tấn công phần cứng nhắm đến mô-đun.

AuthorizationList

Cấu trúc dữ liệu này chứa chính các thuộc tính của cặp khoá, như được xác định trong lớp trừu tượng phần cứng (HAL) Keymaster hoặc KeyMint. Bạn so sánh các giá trị này với trạng thái hiện tại của thiết bị hoặc với một tập hợp các giá trị dự kiến để xác minh rằng một cặp khoá vẫn có hiệu lực để dùng trong ứng dụng của bạn.

Mỗi tên trường tương ứng với một thẻ uỷ quyền Keymaster/KeyMint có tên tương tự. Ví dụ: trường keySize trong một danh sách uỷ quyền tương ứng với thẻ uỷ quyền Tag::KEY_SIZE.

Mỗi trường trong danh sách sau đều không bắt buộc:

purpose
Tương ứng với thẻ uỷ quyền Tag::PURPOSE. Thẻ này dùng giá trị mã nhận dạng thẻ là 1.
algorithm

Tương ứng với thẻ uỷ quyền Tag::ALGORITHM. Thẻ này dùng giá trị mã nhận dạng thẻ là 2.

Trong đối tượng AuthorizationList chứng thực, giá trị thuật toán luôn là RSA hoặc EC.

keySize
Tương ứng với thẻ uỷ quyền Tag::KEY_SIZE. Thẻ này dùng giá trị mã nhận dạng thẻ là 3.
digest
Tương ứng với thẻ uỷ quyền Tag::DIGEST. Thẻ này dùng giá trị mã nhận dạng thẻ là 5.
padding
Tương ứng với thẻ uỷ quyền Tag::PADDING. Thẻ này dùng giá trị mã nhận dạng thẻ là 6.
ecCurve

Tương ứng với thẻ uỷ quyền Tag::EC_CURVE. Thẻ này dùng giá trị mã nhận dạng thẻ là 10.

Tập hợp các tham số dùng để tạo cặp khoá đường cong elip (EC), sử dụng ECDSA để ký và xác minh, trong kho khoá của hệ thống Android.

rsaPublicExponent
Tương ứng với thẻ uỷ quyềnTag::RSA_PUBLIC_EXPONENT. Thẻ này dùng giá trị mã nhận dạng thẻ là 200.
mgfDigest

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 100.

Tương ứng với thẻ uỷ quyền KeyMint Tag::RSA_OAEP_MGF_DIGEST. Thẻ này dùng giá trị mã nhận dạng thẻ là 203.
rollbackResistance

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.

Tương ứng với thẻ uỷ quyền Tag::ROLLBACK_RESISTANT. Thẻ này dùng giá trị mã nhận dạng thẻ là 303.

earlyBootOnly

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 4.

Tương ứng với thẻ uỷ quyền Tag::EARLY_BOOT_ONLY. Thẻ này dùng giá trị mã nhận dạng thẻ là 305.

activeDateTime
Tương ứng với thẻ uỷ quyền Tag::ACTIVE_DATETIME. Thẻ này dùng giá trị mã nhận dạng thẻ là 400.
originationExpireDateTime
Tương ứng với thẻ uỷ quyền Keymaster Tag::ORIGINATION_EXPIRE_DATETIME. Thẻ này dùng giá trị mã nhận dạng thẻ là 401.
usageExpireDateTime
Tương ứng với thẻ uỷ quyền Tag::USAGE_EXPIRE_DATETIME. Thẻ này dùng giá trị mã nhận dạng thẻ là 402.
usageCountLimit
Tương ứng với thẻ uỷ quyền Tag::USAGE_COUNT_LIMIT. Thẻ này dùng giá trị mã nhận dạng thẻ là 405.
noAuthRequired

Tương ứng với thẻ uỷ quyền Tag::NO_AUTH_REQUIRED. Thẻ này dùng giá trị mã nhận dạng thẻ là 503.

userAuthType
Tương ứng với thẻ uỷ quyền Tag::USER_AUTH_TYPE. Thẻ này dùng giá trị mã nhận dạng thẻ là 504.
authTimeout
Tương ứng với thẻ uỷ quyền Tag::AUTH_TIMEOUT. Thẻ này dùng giá trị mã nhận dạng thẻ là 505.
allowWhileOnBody

Tương ứng với thẻ uỷ quyền Tag::ALLOW_WHILE_ON_BODY. Thẻ này dùng giá trị mã nhận dạng thẻ là 506.

Cho phép sử dụng khoá sau khoảng thời gian chờ xác thực nếu người dùng vẫn đeo thiết bị trên người. Lưu ý rằng cảm biến an toàn trên cơ thể sẽ xác định xem người dùng có mang thiết bị trên cơ thể hay không.

trustedUserPresenceRequired

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.

Tương ứng với thẻ uỷ quyền Tag::TRUSTED_USER_PRESENCE_REQUIRED. Thẻ này dùng giá trị mã nhận dạng thẻ là 507.

Chỉ định rằng khoá này chỉ sử dụng được nếu người dùng đã cung cấp bằng chứng về sự hiện diện thực tế. Sau đây là một số ví dụ:

  • Đối với khoá StrongBox, nút phần cứng được gắn cứng vào một ghim trên thiết bị StrongBox.
  • Đối với khoá TEE, quy trình xác thực vân tay sẽ cung cấp bằng chứng về sự hiện diện, miễn là TEE có quyền kiểm soát độc quyền đối với trình quét và thực hiện quy trình so khớp vân tay.
trustedConfirmationRequired

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.

Tương ứng với thẻ uỷ quyền Tag::TRUSTED_CONFIRMATION_REQUIRED. Thẻ này dùng giá trị mã nhận dạng thẻ là 508.

Chỉ định rằng khoá này chỉ sử dụng được nếu người dùng xác nhận dữ liệu đã được ký bằng mã xác thực phê duyệt. Để biết thêm thông tin về cách yêu cầu người dùng xác nhận, hãy xem bài viết Xác nhận bảo vệ của Android.

Lưu ý: Thẻ này chỉ áp dụng cho các khoá sử dụng mục đích SIGN.

unlockedDeviceRequired

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.

Tương ứng với thẻ uỷ quyền Tag::UNLOCKED_DEVICE_REQUIRED. Thẻ này dùng giá trị mã nhận dạng thẻ là 509.

allApplications

Tương ứng với thẻ uỷ quyền Tag::ALL_APPLICATIONS. Thẻ này dùng giá trị mã nhận dạng thẻ là 600.

Cho biết liệu mọi ứng dụng trên một thiết bị có thể truy cập vào cặp khoá hay không.

applicationId
Tương ứng với thẻ uỷ quyền Tag::APPLICATION_ID. Thẻ này dùng giá trị mã nhận dạng thẻ là 601.
creationDateTime
Tương ứng với thẻ uỷ quyền Tag::CREATION_DATETIME. Thẻ này dùng giá trị mã nhận dạng thẻ là 701.
origin

Tương ứng với thẻ uỷ quyền Tag::ORIGIN. Thẻ này dùng giá trị mã nhận dạng thẻ là 702.

rollbackResistant

Chỉ trình bày trong quy trình chứng thực khoá phiên bản 1 và 2.

Tương ứng với thẻ uỷ quyền Tag::ROLLBACK_RESISTANT. Thẻ này dùng giá trị mã nhận dạng thẻ là 703.

rootOfTrust

Tương ứng với thẻ uỷ quyền Tag::ROOT_OF_TRUST. Thẻ này dùng giá trị mã nhận dạng thẻ là 704.

Để biết thêm thông tin, hãy xem phần mô tả cấu trúc dữ liệu RootOfTrust.

osVersion

Tương ứng với thẻ uỷ quyền Tag::OS_VERSION. Thẻ này dùng giá trị mã nhận dạng thẻ là 705.

Phiên bản hệ điều hành Android liên kết với Keymaster, được chỉ định dưới dạng số nguyên gồm 6 chữ số. Ví dụ: phiên bản 8.1.0 được biểu thị là 080100.

Chỉ Keymaster phiên bản 1.0 trở lên mới có giá trị này trong danh sách uỷ quyền.

osPatchLevel

Tương ứng với thẻ uỷ quyền Tag::PATCHLEVEL. Thẻ này dùng giá trị mã nhận dạng thẻ là 706.

Tháng và năm liên quan đến bản vá bảo mật đang được sử dụng trong Keymaster, được chỉ định dưới dạng số nguyên gồm 6 chữ số. Ví dụ: bản vá tháng 8/2018 được biểu thị là 201808.

Chỉ Keymaster phiên bản 1.0 trở lên mới có giá trị này trong danh sách uỷ quyền.

attestationApplicationId

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ uỷ quyền Keymaster Tag::ATTESTATION_APPLICATION_ID. Thẻ này dùng giá trị mã nhận dạng thẻ là 709.

Để biết thêm thông tin, hãy xem phần mô tả cấu trúc dữ liệu AttestationApplicationId.

attestationIdBrand

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ Keymaster Tag::ATTESTATION_ID_BRAND. Thẻ này dùng giá trị mã nhận dạng thẻ là 710.

attestationIdDevice

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ Keymaster Tag::ATTESTATION_ID_DEVICE. Thẻ này dùng giá trị mã nhận dạng thẻ là 711.

attestationIdProduct

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ Keymaster Tag::ATTESTATION_ID_PRODUCT. Thẻ này dùng giá trị mã nhận dạng thẻ là 712.

attestationIdSerial

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ Keymaster Tag::ATTESTATION_ID_SERIAL. Thẻ này dùng giá trị mã nhận dạng thẻ là 713.

attestationIdImei

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ uỷ quyền Tag::ATTESTATION_ID_IMEI. Thẻ này dùng giá trị mã nhận dạng thẻ là 714.

attestationIdMeid

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ uỷ quyền Tag::ATTESTATION_ID_MEID. Thẻ này dùng giá trị mã nhận dạng thẻ là 715.

attestationIdManufacturer

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ uỷ quyền Tag::ATTESTATION_ID_MANUFACTURER. Thẻ này dùng giá trị mã nhận dạng thẻ là 716.

attestationIdModel

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.

Tương ứng với thẻ uỷ quyền Tag::ATTESTATION_ID_MODEL. Thẻ này dùng giá trị mã nhận dạng thẻ là 717.

vendorPatchLevel

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.

Tương ứng với thẻ uỷ quyền Tag::VENDOR_PATCHLEVEL. Thẻ này dùng giá trị mã nhận dạng thẻ là 718.

Chỉ định cấp bản vá bảo mật hình ảnh nhà cung cấp phải được cài đặt trên thiết bị để sử dụng khoá này. Giá trị xuất hiện ở dạng YYYYMMDD, biểu thị ngày của bản vá bảo mật nhà cung cấp. Ví dụ: nếu khoá được tạo trên một thiết bị Android đã cài đặt bản vá bảo mật ngày 1/8/2018 của nhà cung cấp, thì giá trị này sẽ là 20180801.

bootPatchLevel

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.

Tương ứng với thẻ uỷ quyền Tag::BOOT_PATCHLEVEL. Thẻ này dùng giá trị mã nhận dạng thẻ là 719.

Chỉ định cấp bản vá bảo mật hình ảnh nhân hệ điều hành phải được cài đặt trên thiết bị để sử dụng khoá này. Giá trị xuất hiện ở dạng YYYYMMDD, biểu thị ngày của bản vá bảo mật hệ thống. Ví dụ: nếu khoá được tạo trên một thiết bị Android đã cài đặt bản vá bảo mật ngày 5/8/2018 của hệ thống, thì giá trị này sẽ là 20180805.

deviceUniqueAttestation

Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 4.

Tương ứng với thẻ uỷ quyền Tag::DEVICE_UNIQUE_ATTESTATION. Thẻ này dùng giá trị mã nhận dạng thẻ là 720.

RootOfTrust

Tập hợp này của các giá trị xác định thông tin chính về trạng thái của thiết bị.

Mỗi trường trong danh sách sau đây đều bắt buộc:

verifiedBootKey

Hàm băm bảo mật của khoá xác minh hình ảnh hệ thống. Bạn nên sử dụng thuật toán SHA-256 cho hàm băm này.

deviceLocked
True nếu trình tải khởi động của thiết bị bị khoá nên tính năng Xác minh quy trình khởi động có thể kiểm tra và không cho hình ảnh thiết bị chưa ký nhấp nháy trên thiết bị. Để biết thêm thông tin về tính năng này, hãy xem tài liệu về tính năng Xác minh quy trình khởi động.
verifiedBootState
Trạng thái khởi động của thiết bị theo tính năng Xác minh quy trình khởi động.
verifiedBootHash

Chỉ trình bày trong quy trình chứng thực khoá phiên bản 3.

Chuỗi đại diện của tất cả dữ liệu được bảo vệ bằng tính năng Xác minh quy trình khởi động. Đối với các thiết bị sử dụng quy trình triển khai Xác minh quy trình khởi động trên Android của tính năng Xác minh quy trình khởi động, giá trị này chứa chuỗi đại diện cấu trúc VBMeta hoặc cấu trúc siêu dữ liệu của tính năng Xác minh quy trình khởi động.

Để tìm hiểu thêm về cách tính giá trị này, hãy xem phần Chuỗi đại diện VBMeta.

VerifiedBootState

Cấu trúc dữ liệu này cung cấp trạng thái khởi động hiện tại của thiết bị, thể hiện mức độ bảo vệ cho người dùng và cho các ứng dụng sau khi thiết bị khởi động xong. Để biết thêm thông tin về tính năng này, hãy xem phần Trạng thái khởi động trong tài liệu Xác minh quy trình khởi động.

Cấu trúc dữ liệu này là một bản liệt kê nên sẽ nhận chính xác một trong các giá trị sau:

Đã xác minh

Cho biết toàn bộ chuỗi tin cậy, bao gồm trình tải khởi động, phân vùng khởi động và tất cả các phân vùng đã xác minh.

Khi thiết bị ở trạng thái khởi động này, verifiedBootKey là hàm băm của chứng chỉ do thiết bị nhúng mà nhà sản xuất thiết bị sẽ thêm vào ROM của thiết bị lúc xuất xưởng.

SelfSigned

Cho biết rằng chứng chỉ do thiết bị nhúng đã xác minh phân vùng khởi động của thiết bị và chữ ký là hợp lệ.

Khi thiết bị ở trạng thái khởi động này, verifiedBootKey là hàm băm của chứng chỉ do người dùng cài đặt, giúp ký một phân vùng khởi động mà người dùng thêm vào thiết bị thay cho phân vùng khởi động ban đầu do nhà sản xuất cung cấp.

Chưa xác minh
Cho biết rằng người dùng có thể tuỳ ý sửa đổi thiết bị. Do đó, người dùng chịu trách nhiệm xác minh tính toàn vẹn của thiết bị.
Không thành công
Cho biết rằng không xác minh được thiết bị. Chứng chỉ chứng thực không được dùng giá trị này cho VerifiedBootState.

AttestationApplicationId

Cấu trúc dữ liệu này phản ánh niềm tin của nền tảng Android đối với việc ứng dụng nào được phép sử dụng tài liệu khoá bí mật theo quy trình chứng thực. Mã nhận dạng có thể bao gồm nhiều gói khi và chỉ khi nhiều gói dùng chung một UID. Chuỗi octet được tự định dạng theo giản đồ ASN.1 sau đây:

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

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
Một tập hợp gồm các đối tượng AttestationPackageInfo, mỗi đối tượng cung cấp số phiên bản và tên của gói.
signature_digests

Một tập hợp gồm các chuỗi đại diện SHA-256 về chứng chỉ ký của ứng dụng. Một ứng dụng có thể có nhiều chuỗi chứng chỉ khoá ký. Đối với mỗi chuỗi, leaf certificate sẽ được phân tích và đặt vào trường signature_digests. Tên trường này gây nhầm lẫn vì dữ liệu được phân tích là chứng chỉ ký của ứng dụng chứ không phải chữ ký ứng dụng, vì trường này được đặt tên cho lớp Signature do một lệnh gọi đến getPackageInfo() trả về. Đoạn mã sau đây cho thấy một tập ví dụ:

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

Cung cấp giản đồ dữ liệu của tiện ích thông tin

Tiện ích thông tin cấp phép có OID 1.3.6.1.4.1.11129.2.1.30. Tiện ích này cung cấp thông tin mà máy chủ cấp phép biết được về thiết bị. Tiện ích này tuân theo giản đồ CDDL.

  {
        1 : int,   ; certificates issued
  }

Bản đồ này không được tạo phiên bản và có thể thêm các trường tuỳ chọn mới.

certs_issued

Số lượng chứng chỉ ước tính được cấp cho thiết bị trong 30 ngày qua. Giá trị này có thể dùng làm dấu hiệu cho hành vi có thể xảy ra nếu giá trị đó lớn hơn mức trung bình theo một số thứ tự về cường độ.