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

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

注意: 在實際工作環境層級環境中驗證裝置硬體支援金鑰的屬性之前,請先確認該裝置支援硬體層級金鑰認證。如要這麼做,請確認認證憑證鏈結包含使用 Google 認證根金鑰簽署的根憑證,以及金鑰說明資料結構中的 attestationSecurityLevel 元素是否設為 TrustedEnvironment 安全性等級。

另外,請務必驗證憑證鏈結中的簽章,並透過憑證撤銷狀態清單確認憑證鏈結中的金鑰並未遭到撤銷。除非全部都有效,且根金鑰為 Google 根金鑰,否則不要完全信任認證。不過請注意,由於包含已撤銷憑證的裝置,至少仍要支援軟體認證。能充分驗證認證是強烈的正向指標。沒有這個指標代表中立指標,而不是負面。

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

在金鑰認證期間,您要指定金鑰組的別名。傳回的認證工具會提供憑證鏈結,讓您用來驗證該金鑰組的屬性。

如果裝置支援硬體層級金鑰認證,這個鏈結中的根憑證會使用認證根金鑰進行簽署,然後裝置製造商在裝置的硬體支援 KeyStore 中插入憑證。

注意:在搭載硬體層級金鑰認證、Android 7.0 (API 級別 24) 以上版本,以及 Google Play 服務的裝置上,根憑證會使用 Google 認證根金鑰簽署。確認這個根憑證與根憑證一節中列出的憑證有關。

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

  1. 使用 KeyStore 物件的 getCertificateChain() 方法,取得與硬體支援 KeyStore 相關聯的 X.509 憑證鏈結的參照。
  2. 請使用 X509Certificate 物件的 checkValidity() 方法檢查每個憑證的有效性。此外,也請確認根憑證值得信賴。

    注意:雖然您可以在應用程式內直接完成這項程序,但建議您在信任的另一個伺服器上查看憑證的撤銷狀態

  3. 在信任的另一個伺服器上,取得最適合您工具集的 ASN.1 剖析器程式庫參照。找出最接近包含金鑰認證憑證擴充功能的根憑證;請勿假設這是分葉憑證。 使用剖析器從該憑證中擷取金鑰認證憑證擴充功能資料。

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

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

  4. 將您從 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-----
  

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

  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 結構定義 (draft 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 網址副檔名。舊版憑證的狀態也會顯示在認證狀態清單中,因此開發人員可以安全地改為使用新與舊版憑證的認證狀態清單。Key Attestation 範例已包含如何正確驗證 Android 認證金鑰的範例。

金鑰認證擴充功能資料結構定義

金鑰認證擴充功能的 OID 1.3.6.1.4.1.11129.2.1.17 為 OID。這項擴充功能會根據 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 授權清單

安全等級

這個資料結構表示軟體功能 (例如金鑰組) 會根據裝置內部的位置受到保護。

由於資料結構是列舉,因此只接受下列其中一個值:

軟體
建立及管理功能的邏輯是在 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
對應至 Tag::DIGEST 授權標記,標記 ID 值為 5。
padding
對應於使用標記 ID 值 6 的 Tag::PADDING 授權標記。
ecCurve

對應於使用標記 ID 值 10 的 Tag::EC_CURVE 授權標記。

這組參數是用來在 Android 系統 KeyStore 中產生橢圓曲線 (EC) 金鑰組 (使用 ECDSA 進行簽署和驗證)。

rsaPublicExponent
對應於使用標記 ID 值為 200 的 Tag::RSA_PUBLIC_EXPONENT 授權標記。
mgfDigest

僅在金鑰認證版本 >= 100 中使用。

對應至 Tag::RSA_OAEP_MGF_DIGEST KeyMint 授權標記,標記 ID 值為 203。
rollbackResistance

只有在金鑰認證版本 >= 3 中才會顯示。

對應至使用標記 ID 值 303 的 Tag::ROLLBACK_RESISTANT 授權標記。

earlyBootOnly

只有在金鑰認證版本 >= 4 中才會顯示。

對應至使用標記 ID 值 305 的 Tag::EARLY_BOOT_ONLY 授權標記。

activeDateTime
對應於使用標記 ID 值 400 的 Tag::ACTIVE_DATETIME 授權標記。
originationExpireDateTime
對應至 Tag::ORIGINATION_EXPIRE_DATETIME Keymaster 授權標記,標記 ID 值為 401。
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 裝置上。
  • 針對 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 中才會顯示。

對應至 Tag::ATTESTATION_APPLICATION_ID Keymaster 授權標記,標記 ID 值為 709。

詳情請參閱說明 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 的格式顯示,代表供應商安全性修補程式的日期。舉例來說,如果金鑰產生的金鑰是在已安裝供應商的 2018 年 8 月 1 日安全修補程式的 Android 裝置上,這個值就會是 20180801。

bootPatchLevel

僅在金鑰認證版本 3 以上

對應於使用標記 ID 值 719 的 Tag::BOOT_PATCHLEVEL 授權標記。

指定核心映像檔安全性修補程式等級必須安裝在裝置上才能使用這個金鑰。這個值會以 YYYYMMDD 的格式顯示,代表系統安全性修補程式的日期。舉例來說,如果金鑰產生的金鑰是在已安裝系統 2018 年 8 月 5 日安全修補程式的 Android 裝置上,這個值就會是 20180805。

deviceUniqueAttestation

僅在金鑰認證版本 4 以上

對應於使用標記 ID 值 720 的 Tag::DEVICE_UNIQUE_ATTESTATION 授權標記。

RootOfTrust

這個值集合定義了裝置狀態的相關重要資訊。

以下清單中的每個欄位都是必要欄位:

verifiedBootKey

驗證系統映像檔的金鑰安全雜湊。建議您針對這個雜湊使用 SHA-256 演算法。

deviceLocked
如果裝置的系統啟動載入程式處於鎖定狀態,系統會啟用驗證開機檢查功能,並防止未簽署的裝置映像檔刷新至裝置上,則為「true」。如要進一步瞭解這項功能,請參閱驗證啟動說明文件。
verifiedBootState
根據驗證開機程序功能,裝置的啟動狀態
verifiedBootHash

僅適用於金鑰認證版本 3。

由驗證開機程序保護的所有資料摘要。如果裝置使用的是驗證開機程序的 Android 驗證開機程序,則這個值包含 VBMeta struct 或驗證開機程序中繼資料結構的摘要。

如要進一步瞭解如何計算這個值,請參閱 VBMeta 摘要

VerifiedBootState

這個資料結構會提供裝置目前的啟動狀態,代表在裝置啟動後提供給使用者和應用程式的防護等級。如要進一步瞭解這項功能,請參閱驗證啟動說明文件中的「 啟動狀態」一節。

這個資料結構是列舉,因此必須採用下列其中一個值:

已驗證

表示完整的信任鏈,包括系統啟動載入程式、啟動分區和所有已驗證的分區。

如果裝置處於這個啟動狀態,verifiedBootKey 是裝置內嵌憑證的雜湊,裝置製造商會將其新增至裝置的 ROM。

自行簽署

表示裝置內嵌憑證已驗證裝置的啟動分區,且簽名有效。

當裝置處於這個啟動狀態時,verifiedBootKey 是使用者安裝憑證的雜湊,用於簽署使用者新增至裝置的啟動分區,取代製造商提供的啟動分區。

未驗證
表示使用者可以自由修改裝置。因此,使用者必須負責驗證裝置的完整性。
失敗
表示裝置驗證失敗。認證憑證不可將此值用於 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,
}
套件資訊
一組 AttestationPackageInfo 物件,每個物件都會提供套件名稱和版本號碼。
sign_digests

應用程式簽署憑證的 SHA-256 摘要。一個應用程式可以有多個簽署金鑰憑證鏈結。系統會摘要並分別將「葉狀」憑證放在 signature_digests 欄位中。欄位名稱會誤導使用者,因為摘要資料是應用程式的簽署憑證,而非應用程式簽名,因為摘要資料取而代之的是呼叫 getPackageInfo() 傳回的 Signature 類別。以下程式碼片段為範例集:

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