有了金鑰認證功能,您可以更放心地將應用程式中使用的金鑰,儲存在裝置的硬體支援 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_DIGESTKeyMint 授權標記。 -
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_DATETIMEKeymaster 授權標記。 -
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_IDKeymaster 授權標記。詳情請參閱說明 AttestationApplicationId 資料結構的章節。
-
attestationIdBrand -
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 710 的
Tag::ATTESTATION_ID_BRANDKeymaster 授權標記。 -
attestationIdDevice -
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 711 的
Tag::ATTESTATION_ID_DEVICEKeymaster 授權標記。 -
attestationIdProduct -
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 712 的
Tag::ATTESTATION_ID_PRODUCTKeymaster 授權標記。 -
attestationIdSerial -
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 713 的
Tag::ATTESTATION_ID_SERIALKeymaster 授權標記。 -
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 天內核發給裝置的憑證數量約略值。如果此值大於特定數量級的平均值,則可用來當做潛在濫用信號。