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:
-
Sử dụng phương thức
getCertificateChain()
của đối tượngKeyStore
để 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. -
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.
-
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.
-
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.
-
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.
-
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.
-
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:
- Khoá của bạn nằm trong phần cứng mà Google cho là bảo mật; và
- 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 1 Keymaster phiên bản 2.0 2 Keymaster phiên bản 3.0 3 Keymaster phiên bản 4.0 4 Keymaster phiên bản 4.1 100 KeyMint phiên bản 1.0 200 KeyMint 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 0 Keymaster phiên bản 0.2 hoặc 0.3 1 Keymaster phiên bản 1.0 2 Keymaster phiên bản 2.0 3 Keymaster phiên bản 3.0 4 Keymaster phiên bản 4.0 41 Keymaster phiên bản 4.1 100 KeyMint phiên bản 1.0 200 KeyMint 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ặcEC
. -
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ền
Tag::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 KeyMintTag::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ớpSignature
do một lệnh gọi đếngetPackageInfo()
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 độ.