جفت‌های کلید سخت‌افزاری را با تأیید کلید تأیید کنید

تأیید کلید به شما اطمینان بیشتری می دهد که کلیدهایی که در برنامه خود استفاده می کنید در فروشگاه کلیدهای سخت افزاری دستگاه ذخیره می شوند. بخش‌های زیر نحوه تأیید ویژگی‌های کلیدهای سخت‌افزاری و نحوه تفسیر داده‌های پسوند گواهی‌های تأیید را شرح می‌دهند.

توجه: قبل از اینکه ویژگی‌های کلیدهای دارای پشتوانه سخت‌افزاری دستگاه را در محیطی در سطح تولید تأیید کنید، مطمئن شوید که دستگاه از تأیید کلید در سطح سخت‌افزار پشتیبانی می‌کند. برای انجام این کار، بررسی کنید که زنجیره گواهی گواهی حاوی یک گواهی ریشه است که با کلید ریشه گواهی Google امضا شده است و عنصر attestationSecurityLevel در ساختار داده توضیحات کلید روی سطح امنیتی TrustedEnvironment یا سطح امنیتی StrongBox تنظیم شده است.

علاوه بر این، تأیید امضاهای موجود در زنجیره گواهی و تأیید اینکه هیچ یک از کلیدهای زنجیره باطل نشده اند با بررسی لیست وضعیت ابطال گواهی مهم است. مگر اینکه همه معتبر باشند و ریشه کلید اصلی گوگل باشد، به گواهی کاملاً اعتماد نکنید. با این حال، توجه داشته باشید که دستگاه‌های حاوی گواهی‌های باطل شده همچنان حداقل به اندازه دستگاه‌هایی که فقط از گواهی نرم‌افزار پشتیبانی می‌کنند قابل اعتماد هستند. داشتن یک گواهی کاملا معتبر یک شاخص مثبت قوی است. نداشتن یک شاخص خنثی – نه منفی – است.

یک جفت کلید با پشتوانه سخت افزاری را بازیابی و تأیید کنید

در حین تأیید کلید، نام مستعار یک جفت کلید را مشخص می‌کنید و زنجیره گواهی آن را بازیابی می‌کنید، که می‌توانید از آن برای تأیید ویژگی‌های آن جفت کلید استفاده کنید.

اگر دستگاه از تأیید کلید در سطح سخت‌افزار پشتیبانی می‌کند، گواهی ریشه در این زنجیره با استفاده از یک کلید ریشه تأیید که به طور ایمن در فروشگاه کلید دارای پشتوانه سخت‌افزاری دستگاه ارائه شده است، امضا می‌شود.

توجه: در دستگاه‌هایی که دارای گواهی کلید در سطح سخت‌افزار، Android 7.0 (سطح API 24) یا بالاتر، و سرویس‌های Google Play هستند، گواهی ریشه با کلید اصلی گواهی Google امضا می‌شود. بررسی کنید که این گواهی ریشه از جمله مواردی است که در بخش گواهینامه های ریشه فهرست شده است.

برای اجرای گواهی کلید، مراحل زیر را انجام دهید:

  1. از متد getCertificateChain() یک شی KeyStore برای به دست آوردن ارجاع به زنجیره گواهی های X.509 مرتبط با ذخیره کلید سخت افزاری استفاده کنید.
  2. گواهی ها را برای اعتبارسنجی به سرور جداگانه ای که به آن اعتماد دارید ارسال کنید.

    احتیاط: فرآیند تأیید اعتبار زیر را در همان دستگاهی که KeyStore دارد تکمیل نکنید. اگر سیستم Android در آن دستگاه به خطر بیفتد، می تواند باعث شود که فرآیند اعتبارسنجی به چیزی غیرقابل اعتماد اعتماد کند.

  3. مرجع تجزیه و تحلیل زنجیره گواهی و کتابخانه اعتبار سنجی X.509 که برای مجموعه ابزار شما مناسب ترین است، دریافت کنید. بررسی کنید که گواهی عمومی ریشه قابل اعتماد است و هر گواهینامه گواهی بعدی را در زنجیره امضا می کند.

  4. وضعیت ابطال هر گواهی را بررسی کنید تا مطمئن شوید که هیچ یک از گواهی ها باطل نشده اند.

  5. به صورت اختیاری، پسوند گواهی اطلاعات ارائه را که فقط در زنجیره های گواهی جدیدتر وجود دارد، بررسی کنید.

    مرجعی به کتابخانه تجزیه کننده CBOR که برای مجموعه ابزار شما مناسب است، دریافت کنید. نزدیکترین گواهی را به ریشه که حاوی پسوند گواهی اطلاعات تامین است بیابید. از تجزیه کننده برای استخراج داده های پسوند گواهی اطلاعات تهیه از آن گواهی استفاده کنید.

    برای جزئیات بیشتر به بخش مربوط به طرح داده های برنامه افزودنی ارائه اطلاعات مراجعه کنید.

  6. مرجعی به کتابخانه تجزیه کننده ASN.1 که برای مجموعه ابزار شما مناسب تر است، دریافت کنید. نزدیکترین گواهی را به ریشه ای که حاوی پسوند گواهی تأیید کلید است، بیابید. اگر پسوند گواهی اطلاعات تامین وجود داشت، پسوند گواهی تایید کلیدی باید در گواهی بلافاصله بعدی باشد. از تجزیه کننده برای استخراج داده های پسوند گواهی گواهینامه کلیدی از آن گواهی استفاده کنید.

    احتیاط: فرض نکنید که پسوند گواهی گواهینامه کلید در گواهی برگ زنجیره است. فقط به اولین رخداد افزونه در زنجیره می توان اعتماد کرد. هر نمونه دیگری از برنامه افزودنی توسط سخت افزار ایمن صادر نشده است و ممکن است توسط مهاجمی صادر شده باشد که زنجیره را گسترش می دهد در حالی که سعی می کند گواهی جعلی برای کلیدهای غیرقابل اعتماد ایجاد کند.

    نمونه تأیید کلیدی از تجزیه کننده ASN.1 از Bouncy Castle برای استخراج داده های توسعه گواهی گواهی استفاده می کند. می توانید از این نمونه به عنوان مرجعی برای ایجاد تجزیه کننده خود استفاده کنید.

    برای جزئیات بیشتر به بخش مربوط به طرح داده های پسوند گواهی کلید مراجعه کنید.

  7. داده های برنامه افزودنی را که در مراحل قبلی بازیابی کرده اید از نظر سازگاری بررسی کنید و با مجموعه مقادیری که انتظار دارید کلید سخت افزاری دارای پشتوانه سخت افزاری باشد، مقایسه کنید.

گواهی های ریشه

قابل اعتماد بودن گواهی به گواهی ریشه زنجیره بستگی دارد. دستگاه‌های اندرویدی که آزمایش‌های لازم برای داشتن مجموعه برنامه‌های Google از جمله Google Play را گذرانده‌اند و با Android 7.0 (سطح API 24) یا بالاتر راه‌اندازی شده‌اند، باید از کلیدهای تأیید امضا شده توسط گواهینامه Google Hardware Attestation Root استفاده کنند. توجه داشته باشید که تا قبل از 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. کلید شما در سخت افزاری است که گوگل معتقد است امن است. و
  2. دارای خواصی است که در گواهینامه ذکر شده است.

اگر زنجیره گواهی دارای کلید عمومی ریشه دیگری باشد، گوگل هیچ ادعایی در مورد امنیت سخت افزار ندارد. این به این معنی نیست که کلید شما به خطر افتاده است، فقط تأیید نمی کند که کلید در سخت افزار امن است. مفروضات امنیتی خود را بر این اساس تنظیم کنید.

اگر گواهی ریشه حاوی کلید عمومی در این صفحه نباشد، دو دلیل محتمل وجود دارد:

  • به احتمال زیاد، دستگاه با نسخه اندروید کمتر از 7.0 راه اندازی شده است و از تایید سخت افزاری پشتیبانی نمی کند. در این مورد، اندروید دارای یک پیاده‌سازی نرم‌افزار گواهی است که همان نوع گواهی گواهی را تولید می‌کند، اما با یک کلید رمزگذاری شده در کد منبع اندروید امضا شده است. از آنجایی که این کلید امضا مخفی نیست، گواهی ممکن است توسط مهاجمی ایجاد شده باشد که تظاهر به ارائه سخت افزار ایمن می کند.
  • دلیل احتمالی دیگر این است که دستگاه یک دستگاه Google Play نیست. در این صورت، سازنده دستگاه مختار است که ریشه خود را ایجاد کند و هر ادعایی را که دوست دارد در مورد معنای گواهی ارائه دهد. به مستندات سازنده دستگاه مراجعه کنید. توجه داشته باشید که تا زمان نگارش این مقاله، گوگل از هیچ سازنده دستگاهی که این کار را انجام داده باشد، اطلاعی ندارد.

لیست وضعیت ابطال گواهی

کلیدهای تصدیق را می توان به دلایلی باطل کرد، از جمله سوء استفاده یا استخراج مشکوک توسط مهاجم. بنابراین، بسیار مهم است که وضعیت هر گواهی در یک زنجیره گواهی با فهرست وضعیت ابطال گواهی رسمی (CRL) بررسی شود. این فهرست توسط گوگل نگهداری می شود و در آدرس زیر منتشر شده است: https://android.googleapis.com/attestation/status . هدر Cache-Control در پاسخ HTTP تعیین می‌کند که هر چند وقت یک‌بار برای به‌روزرسانی‌ها بررسی شود، بنابراین برای هر گواهی تأیید شده نیازی به درخواست شبکه نیست. این نشانی وب یک فایل 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 تعبیه‌شده در گواهی‌های گواهینامه قدیمی به کار خود ادامه می‌دهند. گواهی‌های تأیید جدید دیگر حاوی پسوند URL CRL نیستند. وضعیت گواهی‌های قدیمی نیز در فهرست وضعیت گواهی گنجانده شده است، بنابراین توسعه‌دهندگان می‌توانند با خیال راحت به استفاده از فهرست وضعیت گواهی برای گواهی‌های جدید و گواهی‌های قدیمی تغییر دهند. نمونه‌ای از نحوه درستی‌سنجی کلیدهای گواهی‌نامه Android در نمونه تأیید کلید موجود است.

طرح داده های پسوند گواهی کلید

پسوند تأیید کلید دارای OID 1.3.6.1.4.1.11129.2.1.17 است. برنامه افزودنی اطلاعات را بر اساس طرح ASN.1 ذخیره می کند. برای مشاهده طرح مربوط به نسخه گواهی که استفاده می کنید، برگه مناسب را در فهرست طرحواره زیر انتخاب کنید:

نسخه 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

نسخه 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  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,
    hardwareEnforced  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,
    hardwareEnforced  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,
    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,
    hardwareEnforced  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,
    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,
    hardwareEnforced  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,
    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,
    hardwareEnforced  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,
    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),
}

لیست زیر شرحی از هر عنصر در طرحواره ارائه می دهد:

توضیحات کلیدی

این دنباله از مقادیر اطلاعات کلی در مورد جفت کلید را که از طریق تأیید کلید تأیید می شود ارائه می دهد و دسترسی آسان به جزئیات اضافی را فراهم می کند.

attestationVersion
نسخه ویژگی گواهی کلید.
ارزش نسخه
1 کی مستر نسخه 2.0
2 کی مستر نسخه 3.0
3 کی مستر نسخه 4.0
4 کی مستر نسخه 4.1
100 KeyMint نسخه 1.0
200 KeyMint نسخه 2.0
300 KeyMint نسخه 3.0
attestationSecurityLevel

سطح امنیتی گواهینامه

هشدار: اگرچه می توان کلیدهایی را که در سیستم Android ذخیره شده اند تأیید کرد - یعنی اگر مقدار attestationSecurityLevel روی Software تنظیم شده باشد - اگر سیستم Android به خطر بیفتد نمی توانید به این گواهی ها اعتماد کنید.

keymasterVersion / keyMintVersion
نسخه لایه انتزاعی سخت افزار Keymaster یا KeyMint (HAL).
ارزش نسخه
0 کی مستر نسخه 0.2 یا 0.3
1 کی مستر نسخه 1.0
2 کی مستر نسخه 2.0
3 کی مستر نسخه 3.0
4 کی مستر نسخه 4.0
41 کی مستر نسخه 4.1
100 KeyMint نسخه 1.0
200 KeyMint نسخه 2.0
300 KeyMint نسخه 3.0
keymasterSecurityLevel / keyMintSecurityLevel
سطح امنیتی اجرای Keymaster/KeyMint.
attestationChallenge
شامل چالشی است که در زمان ایجاد کلید ارائه شد. بررسی کنید که آیا این مقدار با مقدار ارائه شده توسط سرور شما مطابقت دارد، همانطور که در برچسب مجوز Tag::ATTESTATION_CHALLENGE ذخیره شده است. در غیر این صورت، سرویس شما ممکن است در برابر پخش مجدد گواهینامه های گواهی قدیمی آسیب پذیر باشد.
uniqueId
این مقدار دستگاه را شناسایی می کند - اما فقط برای مدت زمان محدودی. محاسبه شده است و فقط توسط برنامه های سیستم استفاده می شود. در همه برنامه‌های دیگر، uniqueId خالی است.
softwareEnforced
اختیاری. لیست مجوز Keymaster / KeyMint که توسط سیستم Android اعمال می شود، نه توسط Trusted Execution Environment (TEE) دستگاه. اطلاعات موجود در این لیست مجوز توسط کدی که بخشی از پلتفرم است و در پارتیشن سیستم دستگاه ذخیره می شود، جمع آوری یا تولید می شود. تا زمانی که دستگاه دارای سیستم عاملی است که با مدل امنیتی پلتفرم Android مطابقت دارد، می توان به محتویات این فهرست مجوز اعتماد کرد. همه دستگاه‌های Android تأیید شده با این مدل امنیتی مطابقت دارند، بنابراین اگر دستگاه قفل است و وضعیت بوت تأیید شده Verified است، مقادیر اینجا باید قابل اعتماد باشند. در یک دستگاه تغییر یافته، جایی که بوت لودر آنلاک است، کاربر می تواند سیستم عاملی را نصب کند که با مدل امنیتی پلتفرم اندروید سازگار نیست، بنابراین مقادیر موجود در این قسمت ممکن است به طور دلخواه توسط کاربر انتخاب شوند.
hardwareEnforced
اختیاری. لیست مجوز Keymaster / KeyMint که توسط محیط اجرای مورد اعتماد دستگاه (TEE) اعمال می شود. اطلاعات موجود در این فهرست مجوز توسط کدی جمع‌آوری یا تولید می‌شود که بخشی از سخت‌افزار امن است و توسط پلتفرم کنترل نمی‌شود. به عنوان مثال، اطلاعات موجود در این لیست مجوز از بوت لودر دستگاه یا TEE در حال اجرا بر روی دستگاه می آید. فیلدهایی در این فهرست مجوز که مستقیماً توسط KeyMint تنظیم نشده‌اند، توسط سایر بخش‌های سخت‌افزار امن (مثلاً بوت‌لودر) از طریق کانال‌های ارتباطی امنی ارائه می‌شوند که مستلزم اعتماد به پلتفرم نیستند. تمایز بین سخت افزار امن و سیستم اندروید در این است که کاربر نمی تواند کد در حال اجرا در سخت افزار امن (سیستم افزار) را تغییر دهد، بنابراین کاربر نمی تواند مقادیر موجود در این لیست مجوز را تغییر دهد.

سطح امنیت

این ساختار داده نشان می‌دهد که یک ویژگی نرم‌افزاری، مانند یک جفت کلید، بر اساس مکان آن در دستگاه تا چه حد محافظت می‌شود.

از آنجایی که ساختار داده یک شمارش است، دقیقاً یکی از مقادیر زیر را می گیرد:

فروشگاه کلید
منطق ایجاد و مدیریت ویژگی در سیستم اندروید پیاده سازی شده است. برای اهداف ایجاد و ذخیره‌سازی جفت‌های کلید، این مکان نسبت به TEE امنیت کمتری دارد، اما از فضای پردازش برنامه شما امن‌تر است.
محیط زیست قابل اعتماد
منطق ایجاد و مدیریت این ویژگی در سخت افزار امن مانند TEE پیاده سازی می شود. برای اهداف ایجاد و ذخیره‌سازی جفت‌های کلید، این مکان امن‌تر است، زیرا سخت‌افزار امن در برابر نفوذ از راه دور بسیار مقاوم است.
StrongBox
منطق ایجاد و مدیریت این ویژگی در یک ماژول امنیتی سخت افزاری اختصاصی پیاده سازی شده است. برای اهداف ایجاد و ذخیره‌سازی جفت‌های کلید، این مکان امن‌تر است، زیرا در برابر نفوذ از راه دور و حملات سخت‌افزاری علیه ماژول بسیار مقاوم است.
نرم افزار
منطق ایجاد و مدیریت این ویژگی در پیاده سازی KeyMint یا Keymaster که در یک محیط امن اجرا نمی شود، پیاده سازی می شود. برای اهداف ایجاد و ذخیره‌سازی جفت‌های کلید، این مکان نسبت به TEE امنیت کمتری دارد، اما از فضای پردازش برنامه شما امن‌تر است.

لیست مجوز

این ساختار داده حاوی ویژگی های خود جفت کلید است، همانطور که در لایه انتزاعی سخت افزار Keymaster یا KeyMint (HAL) تعریف شده است. شما این مقادیر را با وضعیت فعلی دستگاه یا مجموعه‌ای از مقادیر مورد انتظار مقایسه می‌کنید تا تأیید کنید که یک جفت کلید هنوز برای استفاده در برنامه شما معتبر است.

نام هر فیلد مربوط به برچسب مجوز Keymaster / KeyMint با نام مشابه است. به عنوان مثال، فیلد keySize در یک لیست مجوز با برچسب مجوز Tag::KEY_SIZE مطابقت دارد.

مشخصات رابط AIDL اطلاعات قطعی در مورد برچسب های مجوز را در خود نگه می دارد. این مقدار شناسه و نوع هر تگ را مشخص می‌کند، و همچنین نشان می‌دهد که آیا انتظار می‌رود هر تگ در لیست مجوزهای hardwareEnforced (که نشان می‌دهد تگ در محیط امن اعمال می‌شود) وجود داشته باشد یا در لیست مجوزهای softwareEnforced (نشان می‌دهد که برچسب توسط Android، معمولاً توسط Keystore اعمال می شود.

هر فیلد در لیست زیر اختیاری است:

purpose
مربوط به برچسب مجوز Tag::PURPOSE که از مقدار شناسه برچسب 1 استفاده می کند.
algorithm

مربوط به تگ مجوز Tag::ALGORITHM است که از مقدار شناسه برچسب 2 استفاده می کند.

در یک شیء تاییدیه AuthorizationList ، مقدار الگوریتم همیشه RSA یا EC است.

keySize
مربوط به برچسب مجوز Tag::KEY_SIZE است که از مقدار شناسه برچسب 3 استفاده می کند.
digest
مربوط به برچسب مجوز Tag::DIGEST که از مقدار شناسه برچسب 5 استفاده می کند.
padding
مربوط به برچسب مجوز Tag::PADDING است که از مقدار شناسه برچسب 6 استفاده می کند.
ecCurve

مربوط به برچسب مجوز Tag::EC_CURVE است که از مقدار شناسه برچسب 10 استفاده می کند.

مجموعه پارامترهای مورد استفاده برای ایجاد یک جفت کلید منحنی بیضوی (EC) که از ECDSA برای امضا و تأیید در فروشگاه کلید سیستم اندروید استفاده می‌کند.

rsaPublicExponent
مربوط به برچسب مجوز Tag::RSA_PUBLIC_EXPONENT است که از مقدار شناسه برچسب 200 استفاده می کند.
mgfDigest

فقط در نسخه گواهی کلیدی >= 100 ارائه شود.

مربوط به Tag::RSA_OAEP_MGF_DIGEST مجوز KeyMint است که از مقدار شناسه برچسب 203 استفاده می کند.
rollbackResistance

فقط در نسخه گواهی کلیدی >= 3 ارائه شود.

مربوط به برچسب مجوز Tag::ROLLBACK_RESISTANT که از مقدار شناسه برچسب 303 استفاده می کند.

earlyBootOnly

فقط در نسخه گواهی کلیدی >= 4 ارائه شود.

مربوط به برچسب مجوز Tag::EARLY_BOOT_ONLY که از مقدار شناسه برچسب 305 استفاده می کند.

activeDateTime
مربوط به برچسب مجوز Tag::ACTIVE_DATETIME است که از مقدار شناسه برچسب 400 استفاده می کند.
originationExpireDateTime
مربوط به Tag::ORIGINATION_EXPIRE_DATETIME مجوز Keymaster است که از مقدار شناسه برچسب 401 استفاده می کند.
usageExpireDateTime
مربوط به برچسب مجوز Tag::USAGE_EXPIRE_DATETIME است که از مقدار شناسه برچسب 402 استفاده می کند.
usageCountLimit
مربوط به برچسب مجوز Tag::USAGE_COUNT_LIMIT است که از مقدار شناسه برچسب 405 استفاده می کند.
noAuthRequired

مربوط به برچسب مجوز Tag::NO_AUTH_REQUIRED که از مقدار شناسه برچسب 503 استفاده می کند.

userAuthType
مربوط به برچسب مجوز Tag::USER_AUTH_TYPE است که از مقدار شناسه برچسب 504 استفاده می کند.
authTimeout
مربوط به برچسب مجوز Tag::AUTH_TIMEOUT است که از مقدار شناسه برچسب 505 استفاده می کند.
allowWhileOnBody

مربوط به برچسب مجوز Tag::ALLOW_WHILE_ON_BODY است که از مقدار شناسه برچسب 506 استفاده می کند.

در صورتی که کاربر همچنان دستگاه را روی بدن خود می‌پوشد، به کلید اجازه می‌دهد پس از مدت زمان وقفه تأیید اعتبار استفاده شود. توجه داشته باشید که یک سنسور روی بدنه ایمن تعیین می کند که آیا دستگاه بر روی بدن کاربر پوشیده شده است یا خیر.

trustedUserPresenceRequired

فقط در نسخه گواهی کلیدی >= 3 ارائه شود.

مربوط به برچسب مجوز Tag::TRUSTED_USER_PRESENCE_REQUIRED که از مقدار شناسه برچسب 507 استفاده می کند.

مشخص می کند که این کلید فقط در صورتی قابل استفاده است که کاربر مدرک حضور فیزیکی ارائه کرده باشد. چندین مثال شامل موارد زیر است:

  • برای یک کلید StrongBox، یک دکمه سخت افزاری به یک پین در دستگاه StrongBox متصل شده است.
  • برای یک کلید TEE، تا زمانی که TEE کنترل انحصاری اسکنر را داشته باشد و فرآیند تطبیق اثر انگشت را انجام دهد، احراز هویت اثر انگشت اثبات حضور را ارائه می‌کند.
trustedConfirmationRequired

فقط در نسخه گواهی کلیدی >= 3 ارائه شود.

مربوط به برچسب مجوز Tag::TRUSTED_CONFIRMATION_REQUIRED که از مقدار شناسه برچسب 508 استفاده می کند.

مشخص می‌کند که کلید فقط در صورتی قابل استفاده است که کاربر تأییدیه داده‌هایی را که باید امضا می‌شود با استفاده از یک نشانه تأیید ارائه کند. برای اطلاعات بیشتر درباره نحوه دریافت تأییدیه کاربر، به تأیید محافظت شده Android مراجعه کنید.

توجه: این تگ فقط برای کلیدهایی که از هدف SIGN استفاده می کنند قابل استفاده است.

unlockedDeviceRequired

فقط در نسخه گواهی کلیدی >= 3 ارائه شود.

مربوط به برچسب مجوز Tag::UNLOCKED_DEVICE_REQUIRED که از مقدار شناسه برچسب 509 استفاده می کند.

allApplications

مربوط به برچسب مجوز Tag::ALL_APPLICATIONS است که از مقدار شناسه برچسب 600 استفاده می کند.

نشان می دهد که آیا همه برنامه های یک دستگاه می توانند به جفت کلید دسترسی داشته باشند یا خیر.

applicationId
مربوط به تگ مجوز Tag::APPLICATION_ID که از مقدار شناسه برچسب 601 استفاده می کند.
creationDateTime
مربوط به برچسب مجوز Tag::CREATION_DATETIME است که از مقدار شناسه برچسب 701 استفاده می کند.
origin

مربوط به تگ مجوز Tag::ORIGIN که از مقدار شناسه برچسب 702 استفاده می کند.

rollbackResistant

فقط در گواهینامه های کلیدی نسخه های 1 و 2 ارائه شود.

مربوط به برچسب مجوز Tag::ROLLBACK_RESISTANT که از مقدار شناسه برچسب 703 استفاده می کند.

rootOfTrust

مربوط به برچسب مجوز Tag::ROOT_OF_TRUST است که از مقدار شناسه برچسب 704 استفاده می کند.

برای جزئیات بیشتر، به بخش توصیف ساختار داده RootOfTrust مراجعه کنید.

osVersion

مربوط به تگ مجوز Tag::OS_VERSION است که از مقدار شناسه برچسب 705 استفاده می کند.

نسخه سیستم عامل اندروید مرتبط با Keymaster که به عنوان یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، نسخه 8.1.0 به عنوان 080100 نشان داده شده است.

فقط Keymaster نسخه 1.0 یا بالاتر شامل این مقدار در لیست مجوزها است.

osPatchLevel

مربوط به برچسب مجوز Tag::PATCHLEVEL است که از مقدار شناسه برچسب 706 استفاده می کند.

ماه و سال مرتبط با وصله امنیتی که در Keymaster استفاده می شود، به عنوان یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، پچ آگوست 2018 به عنوان 201808 نشان داده شده است.

فقط Keymaster نسخه 1.0 یا بالاتر شامل این مقدار در لیست مجوزها است.

attestationApplicationId

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به Tag::ATTESTATION_APPLICATION_ID مجوز Keymaster است که از مقدار شناسه برچسب 709 استفاده می کند.

برای جزئیات بیشتر، به بخش توصیف ساختار داده AttestationApplicationId مراجعه کنید.

attestationIdBrand

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به Tag::ATTESTATION_ID_BRAND Keymaster است که از مقدار شناسه برچسب 710 استفاده می کند.

attestationIdDevice

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به Tag::ATTESTATION_ID_DEVICE Keymaster است که از مقدار شناسه برچسب 711 استفاده می کند.

attestationIdProduct

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به Tag::ATTESTATION_ID_PRODUCT Keymaster است که از مقدار شناسه برچسب 712 استفاده می کند.

attestationIdSerial

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به Tag::ATTESTATION_ID_SERIAL Keymaster است که از مقدار شناسه برچسب 713 استفاده می کند.

attestationIdImei

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_IMEI است که از مقدار شناسه برچسب 714 استفاده می کند.

attestationIdMeid

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_MEID است که از مقدار شناسه برچسب 715 استفاده می کند.

attestationIdManufacturer

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_MANUFACTURER که از مقدار شناسه برچسب 716 استفاده می کند.

attestationIdModel

فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_MODEL است که از مقدار شناسه برچسب 717 استفاده می کند.

vendorPatchLevel

فقط در نسخه های گواهی کلیدی >= 3 ارائه شود.

مربوط به برچسب مجوز Tag::VENDOR_PATCHLEVEL است که از مقدار شناسه برچسب 718 استفاده می کند.

سطح وصله امنیتی تصویر فروشنده را که برای استفاده از این کلید باید روی دستگاه نصب شود، مشخص می کند. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی فروشنده است. به عنوان مثال، اگر کلیدی در یک دستگاه اندرویدی با نصب وصله امنیتی 1 آگوست 2018 فروشنده تولید شود، این مقدار 20180801 خواهد بود.

bootPatchLevel

فقط در نسخه های گواهی کلیدی >= 3 ارائه شود.

مربوط به برچسب مجوز Tag::BOOT_PATCHLEVEL است که از مقدار شناسه برچسب 719 استفاده می کند.

سطح وصله امنیتی تصویر هسته را مشخص می کند که برای استفاده از این کلید باید روی دستگاه نصب شود. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی سیستم است. به عنوان مثال، اگر کلیدی در دستگاه اندرویدی با نصب وصله امنیتی 5 آگوست 2018 سیستم تولید شود، این مقدار 20180805 خواهد بود.

deviceUniqueAttestation

فقط در نسخه های گواهی کلیدی >= 4 ارائه شود.

مربوط به برچسب مجوز Tag::DEVICE_UNIQUE_ATTESTATION که از مقدار شناسه برچسب 720 استفاده می کند.

attestationIdSecondImei

فقط در نسخه های گواهی کلیدی >= 300 ارائه شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_SECOND_IMEI که از مقدار شناسه برچسب 723 استفاده می کند.

RootOfTrust

این مجموعه مقادیر اطلاعات کلیدی در مورد وضعیت دستگاه را تعریف می کند.

هر فیلد در لیست زیر الزامی است:

verifiedBootKey

هش ایمن کلید که تصویر سیستم را تأیید می کند. توصیه می شود برای این هش از الگوریتم SHA-256 استفاده کنید.

deviceLocked
درست است اگر بوت لودر دستگاه قفل باشد، که بررسی بوت تأیید شده را فعال می‌کند و از فلش شدن تصویر دستگاه بدون علامت روی دستگاه جلوگیری می‌کند. برای اطلاعات بیشتر در مورد این ویژگی، به مستندات تأیید بوت مراجعه کنید.
verifiedBootState
وضعیت بوت دستگاه با توجه به قابلیت Verified Boot.
verifiedBootHash

فقط در نسخه های گواهی کلیدی >= 3 ارائه شود.

خلاصه ای از تمام داده های محافظت شده توسط Verified Boot. برای دستگاه‌هایی که از اجرای Android Verified Boot از Verified Boot استفاده می‌کنند، این مقدار حاوی خلاصه ساختار VBMeta یا ساختار فراداده Verified Boot است.

برای کسب اطلاعات بیشتر در مورد نحوه محاسبه این مقدار، به The VBMeta Digest مراجعه کنید.

VerifiedBootState

این ساختار داده وضعیت بوت فعلی دستگاه را ارائه می دهد که نشان دهنده سطح حفاظتی است که پس از اتمام بوت شدن دستگاه برای کاربر و برنامه ها ارائه می شود. برای اطلاعات بیشتر در مورد این ویژگی، به بخش Boot State در اسناد تأیید بوت مراجعه کنید.

این ساختار داده یک شمارش است، بنابراین دقیقاً یکی از مقادیر زیر را می گیرد:

تایید شده است

یک زنجیره کامل از اعتماد را نشان می دهد که شامل بوت لودر، پارتیشن بوت و تمام پارتیشن های تایید شده است.

هنگامی که دستگاه در این حالت بوت است، verifiedBootKey هش گواهی تعبیه شده در دستگاه است که سازنده دستگاه آن را در کارخانه به رام دستگاه اضافه می کند.

خود امضا شده

نشان می دهد که گواهی جاسازی شده در دستگاه پارتیشن بوت دستگاه را تأیید کرده و امضا معتبر است.

هنگامی که دستگاه در این حالت بوت است، verifiedBootKey هش یک گواهی نصب شده توسط کاربر است که پارتیشن بوت را امضا می کند که کاربر به جای پارتیشن بوت اصلی ارائه شده توسط سازنده به دستگاه اضافه می کند.

تایید نشده
نشان می دهد که کاربر می تواند آزادانه دستگاه را تغییر دهد. بنابراین، کاربر مسئول بررسی یکپارچگی دستگاه است.
شکست خورد
نشان می دهد که دستگاه تأیید نشده است. گواهی گواهی هرگز نباید از این مقدار برای VerifiedBootState استفاده کند.

شناسه برنامه تایید

این ساختار داده منعکس کننده باور پلتفرم اندروید در مورد اینکه کدام برنامه ها مجاز به استفاده از مواد کلید مخفی تحت تأیید هستند را نشان می دهد. شناسه می‌تواند شامل چندین بسته باشد اگر و تنها در صورتی که چندین بسته یک UID مشترک داشته باشند. رشته octet خود طبق طرح ASN.1 زیر قالب بندی می شود:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
بسته_اطلاعات
مجموعه ای از اشیاء AttestationPackageInfo که هر کدام نام و شماره نسخه بسته را ارائه می کنند.
signature_digests

مجموعه‌ای از خلاصه‌های SHA-256 از گواهی‌های امضای برنامه. یک برنامه می‌تواند چندین زنجیره گواهی کلید امضاکننده داشته باشد. برای هر کدام، گواهی "برگ" هضم شده و در قسمت signature_digests قرار می گیرد. نام فیلد گمراه‌کننده است، زیرا داده‌های هضم شده گواهی‌های امضای برنامه هستند، نه امضاهای برنامه، زیرا برای کلاس Signature نامگذاری شده است که با فراخوانی به getPackageInfo() بازگردانده شده است. قطعه کد زیر یک مجموعه نمونه را نشان می دهد:

{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 روز گذشته برای دستگاه صادر شده است. این مقدار می‌تواند به‌عنوان سیگنالی برای سوءاستفاده احتمالی استفاده شود، اگر مقدار با مقداری از مقدار از حد متوسط ​​بیشتر باشد.