使用金鑰認證功能驗證硬體支援的金鑰組

有了金鑰認證功能,您可以更放心地將應用程式中使用的金鑰,儲存在裝置的硬體支援 KeyStore 中。以下各節將說明如何驗證硬體支援金鑰的屬性,以及如何解讀認證憑證的擴充資料。

注意:在正式版層級環境中驗證裝置硬體支援金鑰的屬性之前,請先確認該裝置支援硬體層級金鑰認證。方法是查看認證憑證鏈結,檢查是否包含使用 Google 認證根金鑰簽署的根憑證,並確認金鑰說明資料結構中的 attestationSecurityLevel 元素已設為 TrustedEnvironment 安全性等級。

另外,請務必驗證憑證鏈結中的簽章,並在憑證撤銷狀態清單中確認憑證鏈結中的金鑰均未遭到撤銷。除非所有金鑰都有效,且根金鑰為 Google 根金鑰,否則不要完全信任認證。不過請注意,如果裝置含有已撤銷的憑證,至少仍與僅支援軟體認證的裝置同樣可信。在可信度方面,經過充分驗證的認證是強力的正向指標,但若沒有這類認證,代表的是中立而非負向指標。

擷取及驗證硬體支援的金鑰組

在金鑰認證期間,您可以指定金鑰組的別名並擷取其憑證鏈結,用來驗證該金鑰組的屬性。

如果裝置支援硬體層級金鑰認證,系統會使用認證根金鑰簽署此鏈結中的根憑證,該根金鑰已安全地佈建至裝置硬體支援的 KeyStore。

注意:如果裝置搭載了硬體層級金鑰認證、Android 7.0 (API 級別 24) 以上版本,以及 Google Play 服務,根憑證會由 Google 認證根金鑰簽署。請確認這個根憑證屬於「根憑證」一節中列出的憑證。

如要實作金鑰認證,請完成下列步驟:

  1. 使用 KeyStore 物件的 getCertificateChain() 方法,取得與硬體支援 KeyStore 相關聯的 X.509 憑證鏈結參照。
  2. 將憑證傳送至您信任的獨立伺服器以供驗證。

    注意:請勿在 KeyStore 所在的裝置上完成下列驗證程序。如果該裝置上的 Android 系統遭到入侵,可能會導致驗證程序信任某些不可信的內容。

  3. 取得最適合您工具集的 X.509 憑證鏈結剖析和驗證程式庫的參照。確認根公開憑證可信,且每個憑證都簽署了鏈結中的下一個憑證。

  4. 請檢查每個憑證的撤銷狀態,確保沒有憑證遭到撤銷。

  5. 您可以選擇檢查僅出現在較新憑證鏈結中的佈建資訊憑證擴充資料。

    取得最適合您工具集的 CBOR 剖析器程式庫參照。找出最接近根憑證、且包含佈建資訊憑證擴充資料的憑證。請使用剖析器從該憑證中擷取佈建資訊憑證的擴充資料。

    詳情請參閱「佈建資訊擴充資料的結構定義」一節。

  6. 取得最適合您工具集的 ASN.1 剖析器程式庫參照。找出最接近根憑證,且包含金鑰認證憑證擴充資料的憑證。如果有佈建資訊憑證擴充資料,金鑰認證憑證擴充資料一定位於緊隨其後的憑證之中。請使用剖析器從該憑證中擷取金鑰認證憑證的擴充資料。

    注意:請勿假設金鑰認證憑證擴充資料位於鏈結的分葉憑證中。請只信任鏈結中首次出現的擴充資料。任何該擴充資料的例項都並非由安全硬體核發,而可能是擴充鏈結的攻擊者,在嘗試為不受信任的金鑰建立假認證時發出的。

    金鑰認證範例會使用 Bouncy Castle 中的 ASN.1 剖析器,擷取認證憑證的擴充資料。在建立自己的剖析器時,您可以將此範例做為參考。

    詳情請參閱「金鑰認證擴充資料的結構定義」一節。

  7. 為求一致,請檢查您在先前步驟中擷取的擴充資料,並與預期硬體支援金鑰包含的值組合進行比較。

根憑證

認證的可信度取決於鏈結的根憑證。如果 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-----
  

如果您收到的認證鏈結中的根憑證包含這個公開金鑰,且鏈結中的憑證均未撤銷,則表示:

  1. 您的金鑰位於 Google 認為安全無虞的硬體中;且
  2. 具備認證憑證中說明的屬性。

如果認證鏈結有其他根公開金鑰,則 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
金鑰認證功能的版本。
版本
1Keymaster 2.0 版
2Keymaster 3.0 版
3Keymaster 4.0 版
4Keymaster 4.1 版
100KeyMint 1.0 版
200KeyMint 2.0 版
attestationSecurityLevel

認證的安全性等級

警告:雖然您可以認證儲存在 Android 系統中的金鑰 (也就是在 attestationSecurityLevel 的值設為軟體時),但如果 Android 系統遭到入侵,您就無法信任這些認證。

keymasterVersion/keyMintVersion
Keymaster 或 KeyMint 硬體抽象層 (HAL) 的版本。
版本
0Keymaster 0.2 或 0.3 版
1Keymaster 1.0 版
2Keymaster 2.0 版
3Keymaster 3.0 版
4Keymaster 4.0 版
41Keymaster 4.1 版
100KeyMint 1.0 版
200KeyMint 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 物件中,演算法的值一律為 RSAEC

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 天內核發給裝置的憑證數量約略值。如果此值大於特定數量級的平均值,則可用來當做潛在濫用信號。