有了金鑰認證功能,您可以更放心地將應用程式中使用的金鑰,儲存在裝置的硬體支援 KeyStore 中。以下各節將說明如何驗證硬體支援金鑰的屬性,以及如何解讀認證憑證的擴充資料。
注意:在正式版層級環境中驗證裝置硬體支援金鑰的屬性之前,請先確認該裝置支援硬體層級金鑰認證。方法是查看認證憑證鏈結,檢查是否包含使用 Google 認證根金鑰簽署的根憑證,並確認金鑰說明資料結構中的 attestationSecurityLevel
元素已設為 TrustedEnvironment
安全性等級。
另外,請務必驗證憑證鏈結中的簽章,並在憑證撤銷狀態清單中確認憑證鏈結中的金鑰均未遭到撤銷。除非所有金鑰都有效,且根金鑰為 Google 根金鑰,否則不要完全信任認證。不過請注意,如果裝置含有已撤銷的憑證,至少仍與僅支援軟體認證的裝置同樣可信。在可信度方面,經過充分驗證的認證是強力的正向指標,但若沒有這類認證,代表的是中立而非負向指標。
擷取及驗證硬體支援的金鑰組
在金鑰認證期間,您可以指定金鑰組的別名並擷取其憑證鏈結,用來驗證該金鑰組的屬性。
如果裝置支援硬體層級金鑰認證,系統會使用認證根金鑰簽署此鏈結中的根憑證,該根金鑰已安全地佈建至裝置硬體支援的 KeyStore。
注意:如果裝置搭載了硬體層級金鑰認證、Android 7.0 (API 級別 24) 以上版本,以及 Google Play 服務,根憑證會由 Google 認證根金鑰簽署。請確認這個根憑證屬於「根憑證」一節中列出的憑證。
如要實作金鑰認證,請完成下列步驟:
-
使用
KeyStore
物件的getCertificateChain()
方法,取得與硬體支援 KeyStore 相關聯的 X.509 憑證鏈結參照。 -
將憑證傳送至您信任的獨立伺服器以供驗證。
注意:請勿在 KeyStore 所在的裝置上完成下列驗證程序。如果該裝置上的 Android 系統遭到入侵,可能會導致驗證程序信任某些不可信的內容。
-
取得最適合您工具集的 X.509 憑證鏈結剖析和驗證程式庫的參照。確認根公開憑證可信,且每個憑證都簽署了鏈結中的下一個憑證。
-
請檢查每個憑證的撤銷狀態,確保沒有憑證遭到撤銷。
-
您可以選擇檢查僅出現在較新憑證鏈結中的佈建資訊憑證擴充資料。
取得最適合您工具集的 CBOR 剖析器程式庫參照。找出最接近根憑證、且包含佈建資訊憑證擴充資料的憑證。請使用剖析器從該憑證中擷取佈建資訊憑證的擴充資料。
詳情請參閱「佈建資訊擴充資料的結構定義」一節。
-
取得最適合您工具集的 ASN.1 剖析器程式庫參照。找出最接近根憑證,且包含金鑰認證憑證擴充資料的憑證。如果有佈建資訊憑證擴充資料,金鑰認證憑證擴充資料一定位於緊隨其後的憑證之中。請使用剖析器從該憑證中擷取金鑰認證憑證的擴充資料。
注意:請勿假設金鑰認證憑證擴充資料位於鏈結的分葉憑證中。請只信任鏈結中首次出現的擴充資料。任何該擴充資料的例項都並非由安全硬體核發,而可能是擴充鏈結的攻擊者,在嘗試為不受信任的金鑰建立假認證時發出的。
金鑰認證範例會使用 Bouncy Castle 中的 ASN.1 剖析器,擷取認證憑證的擴充資料。在建立自己的剖析器時,您可以將此範例做為參考。
詳情請參閱「金鑰認證擴充資料的結構定義」一節。
-
為求一致,請檢查您在先前步驟中擷取的擴充資料,並與預期硬體支援金鑰包含的值組合進行比較。
根憑證
認證的可信度取決於鏈結的根憑證。如果 Android 裝置已通過安裝 Google 一系列應用程式 (包括 Google Play) 所需的測試,且搭載 Android 7.0 (API 級別 24) 以上版本,則應使用由 Google 硬體認證根憑證簽署的認證金鑰。請注意,搭載 Android 8.0 (API 級別 26) 以下版本的裝置不需要認證。根公開金鑰如下:
-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xU FmOr75gvMsd/dTEDDJdSSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5j lRfdnJLmN0pTy/4lj4/7tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y //0rb+T+W8a9nsNL/ggjnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73X pXyTqRxB/M0n1n/W9nGqC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYI mQQcHtGl/m00QLVWutHQoVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB +TxywElgS70vE0XmLD+OJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7q uvmag8jfPioyKvxnK/EgsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgp Zrt3i5MIlCaY504LzSRiigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7 gLiMm0jhO2B6tUXHI/+MRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82 ixPvZtXQpUpuL12ab+9EaDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+ NpUFgNPN9PvQi8WEg5UmAGMCAwEAAQ== -----END PUBLIC KEY-----
先前核發的根憑證
-----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIJAOj6GWMU0voYMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTYwNTI2MTYyODUyWhcNMjYwNTI0MTYy ODUyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7 tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um AGMCAwEAAaOBpjCBozAdBgNVHQ4EFgQUNmHhAHyIBQlRi0RsR/8aTMnqTxIwHwYD VR0jBBgwFoAUNmHhAHyIBQlRi0RsR/8aTMnqTxIwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAYYwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cHM6Ly9hbmRyb2lk Lmdvb2dsZWFwaXMuY29tL2F0dGVzdGF0aW9uL2NybC8wDQYJKoZIhvcNAQELBQAD ggIBACDIw41L3KlXG0aMiS//cqrG+EShHUGo8HNsw30W1kJtjn6UBwRM6jnmiwfB Pb8VA91chb2vssAtX2zbTvqBJ9+LBPGCdw/E53Rbf86qhxKaiAHOjpvAy5Y3m00m qC0w/Zwvju1twb4vhLaJ5NkUJYsUS7rmJKHHBnETLi8GFqiEsqTWpG/6ibYCv7rY DBJDcR9W62BW9jfIoBQcxUCUJouMPH25lLNcDc1ssqvC2v7iUgI9LeoM1sNovqPm QUiG9rHli1vXxzCyaMTjwftkJLkf6724DFhuKug2jITV0QkXvaJWF4nUaHOTNA4u JU9WDvZLI1j83A+/xnAJUucIv/zGJ1AMH2boHqF8CY16LpsYgBt6tKxxWH00XcyD CdW2KlBCeqbQPcsFmWyWugxdcekhYsAWyoSf818NUsZdBWBaR/OukXrNLfkQ79Iy ZohZbvabO/X+MVT3rriAoKc8oE2Uws6DF+60PV7/WIPjNvXySdqspImSN78mflxD qwLqRBYkA3I75qppLGG9rp7UCdRjxMl8ZDBld+7yvHVgt1cVzJx9xnyGCC23Uaic MDSXYrB4I4WHXPGjxhZuCuPBLTdOLU8YRvMYdEvYebWHMpvwGCF6bAx3JBpIeOQ1 wDB5y0USicV3YgYGmi+NZfhA4URSh77Yd6uuJOJENRaNVTzk -----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- MIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz NzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7 tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu XKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U h6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno L/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok QBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA D32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI mMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW Fua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91 oeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o jm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH ex0SdDrx+tWUDqG8At2JHA== -----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- MIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx MDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7 tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG zWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan 63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T QH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ erGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL Zez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a 0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH 7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b HQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w lZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2 Ob3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7 mD/vFDkzF+wm7cyWpQpCVQ== -----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- MIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw NzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7 tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7 174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC W/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G tkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx oSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG 1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF mr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz lHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw n6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu zbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo vaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn w1IdYIg2Wxg7yHcQZemFQg== -----END CERTIFICATE-----
如果您收到的認證鏈結中的根憑證包含這個公開金鑰,且鏈結中的憑證均未撤銷,則表示:
- 您的金鑰位於 Google 認為安全無虞的硬體中;且
- 具備認證憑證中說明的屬性。
如果認證鏈結有其他根公開金鑰,則 Google 不會對硬體安全性做出任何聲明。這並不代表您的金鑰遭駭,只是因為認證無法證明金鑰位於安全的硬體中。請據此調整您的安全性假設。
如果根憑證沒有本頁面的公開金鑰,可能原因如下:
- 很可能是搭載 Android 7.0 以下版本的裝置,且不支援硬體認證。在此情況下,Android 的軟體實作認證會產生相同種類的認證憑證,但使用在 Android 原始碼中經過硬式編碼的金鑰簽署。此簽署金鑰並非密鑰,因此可能是由攻擊者偽裝成提供安全硬體的攻擊者所建立。
- 另一個可能的原因是該裝置並非 Google Play 裝置。在這種情況下,裝置製造商可以自由建立自己的根層級,並且任意宣告認證代表的意義。請參閱裝置製造商的說明文件。請注意,在撰寫本文期間,Google 未發現已採用上述做法的裝置製造商。
憑證撤銷狀態清單
導致認證金鑰遭撤銷的原因有很多,包括處理錯誤或疑似遭到攻擊者擷取。因此,請務必根據官方憑證撤銷狀態清單 (CRL),檢查認證鏈結每個憑證中的狀態。這份清單是由 Google 維護,並發布於:https://android.googleapis.com/attestation/status。HTTP 回應中的 Cache-Control
標頭會決定檢查更新的頻率,因此不需要為所有已驗證憑證發出網路要求。這個網址會傳回 JSON 檔案,內含處於撤銷狀態的憑證,這類憑證沒有任何正常的有效狀態。JSON 檔案格式遵循以下 JSON 結構定義 (草稿 07) 的定義:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "entries": { "description" : "Each entry represents the status of an attestation key. The dictionary-key is the certificate serial number in lowercase hex.", "type": "object", "propertyNames": { "pattern": "^[a-f1-9][a-f0-9]*$" }, "additionalProperties": { "type": "object", "properties": { "status": { "description": "[REQUIRED] Current status of the key.", "type": "string", "enum": ["REVOKED", "SUSPENDED"] }, "expires": { "description": "[OPTIONAL] UTC date when certificate expires in ISO8601 format (YYYY-MM-DD). Can be used to clear expired certificates from the status list.", "type": "string", "format": "date" }, "reason": { "description": "[OPTIONAL] Reason for the current status.", "type": "string", "enum": ["UNSPECIFIED", "KEY_COMPROMISE", "CA_COMPROMISE", "SUPERSEDED", "SOFTWARE_FLAW"] }, "comment": { "description": "[OPTIONAL] Free form comment about the key status.", "type": "string", "maxLength": 140 } }, "required": ["status"], "additionalProperties": false } } }, "required": ["entries"], "additionalProperties": false }
CRL 範例:
{ "entries": { "2c8cdddfd5e03bfc": { "status": "REVOKED", "expires": "2020-11-13", "reason": "KEY_COMPROMISE", "comment": "Key stored on unsecure system" }, "c8966fcb2fbb0d7a": { "status": "SUSPENDED", "reason": "SOFTWARE_FLAW", "comment": "Bug in keystore causes this key malfunction b/555555" } } }
舊版 CRL
嵌入舊認證憑證的 CRL 網址會繼續運作。新認證憑證不再包含 CRL 網址擴充資料。舊憑證的狀態也會顯示在認證狀態清單中,因此開發人員可以安全地改用這份清單,檢查新憑證與舊憑證的狀態。金鑰認證範例中提供了如何正確驗證 Android 認證金鑰的範例。
金鑰認證擴充資料的結構定義
金鑰認證擴充資料包含 OID 1.3.6.1.4.1.11129.2.1.17
。這項擴充資料會根據 ASN.1 結構定義儲存資訊。如要查看與您使用的認證版本相對應的結構定義,請在下列結構定義清單中選取合適的分頁標籤:
版本 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), }
版本 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), }
版本 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), }
版本 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), }
版本 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), }
版本 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), }
以下清單列出了結構定義中每個元素的說明:
KeyDescription
這一系列值呈現了金鑰組的一般資訊,並且可用於輕鬆存取其他詳細資料。這類金鑰組是透過金鑰認證進行驗證。
-
attestationVersion
- 金鑰認證功能的版本。
值 版本 1 Keymaster 2.0 版 2 Keymaster 3.0 版 3 Keymaster 4.0 版 4 Keymaster 4.1 版 100 KeyMint 1.0 版 200 KeyMint 2.0 版 -
attestationSecurityLevel
-
認證的安全性等級。
警告:雖然您可以認證儲存在 Android 系統中的金鑰 (也就是在
attestationSecurityLevel
的值設為軟體時),但如果 Android 系統遭到入侵,您就無法信任這些認證。 -
keymasterVersion
/keyMintVersion
-
Keymaster 或 KeyMint 硬體抽象層 (HAL) 的版本。
值 版本 0 Keymaster 0.2 或 0.3 版 1 Keymaster 1.0 版 2 Keymaster 2.0 版 3 Keymaster 3.0 版 4 Keymaster 4.0 版 41 Keymaster 4.1 版 100 KeyMint 1.0 版 200 KeyMint 2.0 版 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Keymaster/KeyMint 實作的安全性等級。
-
attestationChallenge
-
包含金鑰建立時提供的驗證問題。請檢查這個值是否與伺服器提供的值 (如
Tag::ATTESTATION_CHALLENGE
授權標記中儲存的值) 相符。否則,您的服務可能會容易受到舊認證憑證的重播攻擊。 -
uniqueId
-
這個值可用於識別裝置,但僅限於限定期間。此值經過運算,且僅供系統應用程式使用。所有其他應用程式中,
uniqueId
都是空值。 -
softwareEnforced
- 選用。由 Android 系統 (而非裝置的受信任執行環境 (TEE)) 強制執行的 Keymaster/KeyMint 授權清單。
-
teeEnforced
- 選用。由裝置的 TEE 強制執行的 Keymaster/KeyMint 授權清單。
SecurityLevel
這個資料結構表示軟體功能 (例如金鑰組) 受到的保護程度,取決於其在裝置中的位置。
由於資料結構為列舉性質,因此可以確切採用下列其中一個值:
- Software
- 建立及管理功能的邏輯是在 Android 系統中實作。為了建立及儲存金鑰組,這個位置的安全性比 TEE 低,但比應用程式程序空間安全性的更高。
- TrustedEnvironment
- 建立及管理功能的邏輯是在安全的硬體 (例如 TEE) 中實作。為了建立及儲存金鑰組,這個位置的安全性較高,因為此位置可強力抵禦遠端的入侵。
- StrongBox
- 建立及管理功能的邏輯是在專屬的硬體安全性模組中實作。為了建立及儲存金鑰組,這個位置的安全性較高,因為此位置能強力抵禦遠端入侵,以及對模組進行的硬體攻擊。
AuthorizationList
這個資料結構包含金鑰組本身的屬性,如 Keymaster 或 KeyMint 硬體抽象層 (HAL) 中所定義。請將這些值與裝置目前的狀態或一組預期的值進行比較,確認金鑰組是否仍可在應用程式中使用。
每個欄位名稱都會對應至名稱類似的 Keymaster/KeyMint 授權標記。舉例來說,授權清單中的 keySize
欄位會對應至 Tag::KEY_SIZE
授權標記。
以下清單中的每個欄位皆為選填:
-
purpose
-
對應至使用標記 ID 值 1 的
Tag::PURPOSE
授權標記。 -
algorithm
-
對應至使用標記 ID 值 2 的
Tag::ALGORITHM
授權標記。在認證
AuthorizationList
物件中,演算法的值一律為RSA
或EC
。 -
keySize
-
對應至使用標記 ID 值 3 的
Tag::KEY_SIZE
授權標記。 -
digest
-
對應至使用標記 ID 值 5 的
Tag::DIGEST
授權標記。 -
padding
-
對應至使用標記 ID 值 6 的
Tag::PADDING
授權標記。 -
ecCurve
-
對應至使用標記 ID 值 10 的
Tag::EC_CURVE
授權標記。這組參數是用來在 Android 系統 KeyStore 中產生橢圓曲線 (EC) 金鑰組 (使用 ECDSA 進行簽署和驗證)。
-
rsaPublicExponent
-
對應至使用標記 ID 值 200 的
Tag::RSA_PUBLIC_EXPONENT
授權標記。 -
mgfDigest
-
只存在於金鑰認證 100 以上版本中。
對應至使用標記 ID 值 203 的Tag::RSA_OAEP_MGF_DIGEST
KeyMint 授權標記。 -
rollbackResistance
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 303 的
Tag::ROLLBACK_RESISTANT
授權標記。 -
earlyBootOnly
-
只存在於金鑰認證 4 以上版本中。
對應至使用標記 ID 值 305 的
Tag::EARLY_BOOT_ONLY
授權標記。 -
activeDateTime
-
對應至使用標記 ID 值 400 的
Tag::ACTIVE_DATETIME
授權標記。 -
originationExpireDateTime
-
對應至使用標記 ID 值 401 的
Tag::ORIGINATION_EXPIRE_DATETIME
Keymaster 授權標記。 -
usageExpireDateTime
-
對應至使用標記 ID 值 402 的
Tag::USAGE_EXPIRE_DATETIME
授權標記。 -
usageCountLimit
-
對應至使用標記 ID 值 405 的
Tag::USAGE_COUNT_LIMIT
授權標記。 -
noAuthRequired
-
對應至使用標記 ID 值 503 的
Tag::NO_AUTH_REQUIRED
授權標記。 -
userAuthType
-
對應至使用標記 ID 值 504 的
Tag::USER_AUTH_TYPE
授權標記。 -
authTimeout
-
對應至使用標記 ID 值 505 的
Tag::AUTH_TIMEOUT
授權標記。 -
allowWhileOnBody
-
對應至使用標記 ID 值 506 的
Tag::ALLOW_WHILE_ON_BODY
授權標記。如果使用者仍將裝置戴在身體上,則允許金鑰在驗證逾時後繼續使用。請注意,安全的人體感應器可判斷裝置是否戴在使用者的身體上。
-
trustedUserPresenceRequired
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 507 的
Tag::TRUSTED_USER_PRESENCE_REQUIRED
授權標記。指定只有在使用者已提供實際存在證明的情況下,這個金鑰才能使用。以下提供幾個範例:
- 如果是 StrongBox 金鑰,硬體按鈕會以有線方式連接至 StrongBox 裝置上的 PIN 碼。
- 如果是 TEE 金鑰,只要 TEE 擁有掃描器的專屬控制權,並執行指紋比對程序,指紋驗證功能就會提供存在證明。
-
trustedConfirmationRequired
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 508 的
Tag::TRUSTED_CONFIRMATION_REQUIRED
授權標記。指定只有在使用者確認要透過已核准權杖簽署資料時,金鑰才能使用。如要進一步瞭解如何取得使用者確認,請參閱「Android 保護確認」。
注意:這個標記僅適用於
SIGN
用途的金鑰。 -
unlockedDeviceRequired
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 509 的
Tag::UNLOCKED_DEVICE_REQUIRED
授權標記。 -
allApplications
-
對應至使用標記 ID 值 600 的
Tag::ALL_APPLICATIONS
授權標記。指出裝置上的所有應用程式是否都能存取金鑰組。
-
applicationId
-
對應至使用標記 ID 值 601 的
Tag::APPLICATION_ID
授權標記。 -
creationDateTime
-
對應至使用標記 ID 值 701 的
Tag::CREATION_DATETIME
授權標記。 -
origin
-
對應至使用標記 ID 值 702 的
Tag::ORIGIN
授權標記。 -
rollbackResistant
-
只存在於金鑰認證版本 1 和 2 中。
對應至使用標記 ID 值 703 的
Tag::ROLLBACK_RESISTANT
授權標記。 -
rootOfTrust
-
對應至使用標記 ID 值 704 的
Tag::ROOT_OF_TRUST
授權標記。詳情請參閱說明 RootOfTrust 資料結構的章節。
-
osVersion
-
對應至使用標記 ID 值 705 的
Tag::OS_VERSION
授權標記。與 Keymaster 相關聯的 Android 作業系統版本,以六位數整數指定。舉例來說,8.1.0 版會以 080100 表示。
只有 Keymaster 1.0 以上版本的金鑰會在授權清單中包含這個值。
-
osPatchLevel
-
對應至使用標記 ID 值 706 的
Tag::PATCHLEVEL
授權標記。與在 Keymaster 中使用的安全修補程式相關聯的月份和年份,以六位數整數表示。舉例來說,2018 年 8 月的修補程式會以 201808 表示。
只有 Keymaster 1.0 以上版本的金鑰會在授權清單中包含這個值。
-
attestationApplicationId
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 709 的
Tag::ATTESTATION_APPLICATION_ID
Keymaster 授權標記。詳情請參閱說明 AttestationApplicationId 資料結構的章節。
-
attestationIdBrand
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 710 的
Tag::ATTESTATION_ID_BRAND
Keymaster 授權標記。 -
attestationIdDevice
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 711 的
Tag::ATTESTATION_ID_DEVICE
Keymaster 授權標記。 -
attestationIdProduct
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 712 的
Tag::ATTESTATION_ID_PRODUCT
Keymaster 授權標記。 -
attestationIdSerial
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 713 的
Tag::ATTESTATION_ID_SERIAL
Keymaster 授權標記。 -
attestationIdImei
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 714 的
Tag::ATTESTATION_ID_IMEI
授權標記。 -
attestationIdMeid
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 715 的
Tag::ATTESTATION_ID_MEID
授權標記。 -
attestationIdManufacturer
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 716 的
Tag::ATTESTATION_ID_MANUFACTURER
授權標記。 -
attestationIdModel
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 717 的
Tag::ATTESTATION_ID_MODEL
授權標記。 -
vendorPatchLevel
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 718 的
Tag::VENDOR_PATCHLEVEL
授權標記。指定如要使用此金鑰,必須在裝置上安裝的「供應商映像檔」安全性修補程式等級。這個值會以 YYYYMMDD 的格式顯示,代表供應商提供安全性修補程式的日期。舉例來說,如果產生金鑰的 Android 裝置安裝了供應商在 2018 年 8 月 1 日提供的安全性修補程式,這個值會是 20180801。
-
bootPatchLevel
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 719 的
Tag::BOOT_PATCHLEVEL
授權標記。指定如要使用此金鑰,必須在裝置上安裝的「核心映像檔」安全性修補程式等級。這個值會以 YYYYMMDD 的格式顯示,代表系統提供安全性修補程式的日期。舉例來說,如果產生金鑰的 Android 裝置安裝了系統在 2018 年 8 月 5 日提供的安全性修補程式,這個值會是 20180805。
-
deviceUniqueAttestation
-
只存在於金鑰認證 4 以上版本中。
對應於使用標記 ID 值 720 的
Tag::DEVICE_UNIQUE_ATTESTATION
授權標記。
RootOfTrust
這個值集合定義了裝置狀態的金鑰資訊。
以下清單中的每個欄位皆為必填:
-
verifiedBootKey
-
驗證系統映像檔的金鑰安全雜湊。建議您針對這個雜湊使用 SHA-256 演算法。
-
deviceLocked
- 如果裝置的系統啟動載入程式處於鎖定狀態,系統會啟用驗證開機程序檢查功能,並防止未簽署的裝置映像檔刷新至裝置上。如要進一步瞭解這項功能,請參閱驗證開機程序說明文件。
-
verifiedBootState
- 根據驗證開機程序功能,裝置的啟動狀態。
-
verifiedBootHash
-
只存在於金鑰認證版本 3 中。
由驗證開機程序保護的所有資料摘要。如果裝置使用的 Android 驗證開機程序,是透過驗證開機程序功能實作,則這個值包含「VBMeta 結構」摘要,或驗證開機程序的中繼資料結構摘要。
如要進一步瞭解如何計算這個值,請參閱「VBMeta 摘要」。
VerifiedBootState
這個資料結構會提供裝置目前的啟動狀態,代表在裝置啟動後提供給使用者和應用程式的防護層級。如要進一步瞭解這項功能,請參閱「驗證開機程序」說明文件中的「啟動狀態」一節。
這個資料結構為列舉性質,因此必須採用下列其中一個值:
- Verified
-
表示完整的信任鏈結,包括系統啟動載入程式、啟動分區和所有已驗證的分區。
如果裝置處於這個啟動狀態,
verifiedBootKey
是裝置內嵌憑證的雜湊,裝置製造商會在出廠時將其新增至裝置的 ROM 中。 - SelfSigned
-
表示裝置內嵌的憑證已驗證裝置的啟動分區,且簽章有效。
如果裝置處於這個啟動狀態,
verifiedBootKey
是使用者安裝憑證的雜湊,它會簽署一個啟動分區,供使用者新增至裝置,取代製造商提供的原始啟動分區。 - Unverified
- 表示使用者可以自由修改裝置。因此,使用者必須負責驗證裝置的完整性。
- Failed
-
表示裝置驗證失敗。認證憑證不可將此值用於
VerifiedBootState
。
AttestationApplicationId
這個資料結構反映了 Android 平台允許哪些應用程式使用認證中的密鑰資料。只有在多個套件共用同一個 UID 時,這組 ID 才能包含多個套件。八位元字串本身是按照下列 ASN.1 結構定義來設定格式:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
- package_infos
-
一組
AttestationPackageInfo
物件,每個物件都會提供套件名稱和版本號碼。 - signature_digests
-
應用程式簽署憑證的 SHA-256 摘要。一個應用程式可以有多個簽署金鑰憑證鏈結。系統會擷取每個「分葉」憑證,並放在
signature_digests
欄位中。欄位名稱會誤導使用者,因為摘要資料是應用程式的簽署憑證,而非應用程式簽章,原因在於其命名依據為呼叫getPackageInfo()
傳回的Signature
類別。以下程式碼片段為摘要集的示例:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
佈建資訊擴充資料的結構定義
佈建資訊擴充資料包含 OID 1.3.6.1.4.1.11129.2.1.30
。此擴充資料可透過佈建伺服器提供已知的裝置資訊,且符合 CDDL 結構定義。
{ 1 : int, ; certificates issued }
對應內容並非版本,因此可加入新的選用欄位。
-
certs_issued
-
過去 30 天內核發給裝置的憑證數量約略值。如果此值大於特定數量級的平均值,則可用來當做潛在濫用信號。