پیاده‌سازی گواهی‌نامه‌های مبتنی بر سخت‌افزار برای اعتبارنامه‌های دیجیتال

در یک جریان صدور گواهی دیجیتال معمولی با استفاده از مشخصات OpenID برای صدور گواهی قابل تأیید (OpenID4VCI) ، صادرکننده باید بداند که کلید درون گواهی که باید امضا شود، در یک مکان امن ذخیره می‌شود. نوع اثبات android_keystore_attestation - قالبی برای استفاده با OpenID4VCI - یک گزارش امضا شده توسط سخت‌افزار از Android Keystore ارائه می‌دهد و تضمین می‌کند که کلید در یک محیط اجرای قابل اعتماد (TEE) یا StrongBox قفل شده است و نمی‌توان آن را صادر یا کلون کرد.

مروری بر گواهی سخت‌افزار

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

اثبات android_keystore_attestation آرایه‌ای از زنجیره‌های گواهی X.509 است. هر زنجیره نشان‌دهنده یک کلید احراز هویت واحد است و توسط یک گواهی برگ و به دنبال آن گواهی‌های میانی ساختار یافته است.

  • گواهی برگ : شامل کلید و یک افزونه‌ی گواهی‌دهی مخصوص اندروید است.
  • گواهی‌های میانی : برگ را به ریشه اندروید متصل کنید.

مراحل تأیید

صادرکنندگان باید چندین اعتبارسنجی را روی گواهی انجام دهند.

  • گواهی‌نامه‌ای را در زنجیره‌ای که حاوی افزونه‌ی گواهی اندروید (معمولاً گواهی برگ) است، پیدا کنید. این گواهی‌نامه حاوی داده‌های گواهی‌نامه برای کلید ایجاد شده توسط Android Keystore است.
  • تأیید کنید که فیلد attestationChallenge در افزونه با c_nonce ارائه شده توسط پروتکل برای جلوگیری از حملات بازپخش مطابقت دارد.
  • مقدار تمام assertionها (اظهارات) را در افزونه‌هایی که به آنها علاقه‌مند هستید، تأیید کنید.
  • بررسی ابطال را در مورد گواهی‌های Android Keystore انجام دهید.

مقادیر موجود در اثبات گواهی از چندین منبع می‌آیند:

  • صادرکننده: مقادیر مختلفی توسط صادرکننده ارائه می‌شود و رایج‌ترین آنها در قالب فراداده صادرکننده قرار می‌گیرند تا امکان فیلتر کردن در هنگام ارائه فراهم شود.
  • دارنده: مقادیری مانند نام بسته و امضا از دارنده می‌آیند. این موارد از طریق رویه‌های استاندارد صدور به اشتراک گذاشته نمی‌شوند و باید به طور مستقل از دارنده دریافت شوند.
  • پروتکل: مقادیری مانند nonce با attestationChallenge از پروتکل می‌آیند.

برای دستورالعمل‌های کامل‌تر در مورد اعتبارسنجی داده‌های گواهی، به منابع زیر مراجعه کنید:

قالب اثبات گواهی

در یک درخواست اعتبارنامه، مدرک android_keystore_attestation در مثال زیر گنجانده شده است:

{
  "type": "array",
  "description": "An array of certificate chains. Each chain attests a single key.",
  "items": {
    "type": "array",
    "description": "An X.509 certificate chain. Each certificate is a Base64-encoded string. The first element in the chain is the leaf certificate with the extension, the last is the Android Keystore root certificate.",
    "items": {
      "type": "string",
      "description": "A single X.509 certificate (Base64-NoWrap padded DER encoded)."
    },
    "minItems": 1
  },
  "minItems": 1
}

سپس در شیء proofs یک درخواست اعتبارنامه ذخیره می‌شود.

{
  "credential_configuration_id": "org.iso.18013.5.1.mDL",
  "proofs": {
    "android_keystore_attestation": [
      [
        "MII...", // Leaf certificate (contains Keystore extension)
        "MII...", // Intermediate certificate
        "MII..."  // Android Root certificate
      ],
      [ "MII...", "MII...", "MII..." ] // second proof
    ]
  }
}

قالب فراداده صادرکننده

یک صادرکننده، انواع اثباتی را که پشتیبانی می‌کند، با گنجاندن شیء android_keystore_attestation در شیء proof_types_supported برای یک پیکربندی اعتبارنامه مشخص، مشخص می‌کند.

این مثالی از شیء android_keystore_attestation برای صادرکنندگان است:

{
  "type": "object",
  "properties": {
    "proof_signing_alg_values_supported": {
      "type": "array",
      "description": "REQUIRED. As defined in OpenID4VCI 1.0 Section 12.2.4.",
      "items": {
        "type": "string",
        "description": "Cryptographic algorithm identifiers used in the proof_signing_alg_values_supported Credential Issuer metadata parameter for this proof type are case sensitive strings and SHOULD be one of those defined in [IANA.JOSE]."
      },
      "minItems": 1
    },
    "key_attestations_required": {
      "type": "object",
      "description": "OPTIONAL. Specifies the minimum attestation requirements.",
      "properties": {
        "key_mint_security_level": {
          "type": "string",
          "description": "OPTIONAL. Minimum accepted keyMintSecurityLevel. Values defined in https://source.android.com/docs/security/features/keystore/attestation#securitylevel-values.",
          "enum": ["Software", "TrustedEnvironment", "StrongBox"],
          "default": "TrustedEnvironment"
        },
        "user_auth_types": {
          "type": "array",
          "description": "OPTIONAL. A list of authentication types which can authorize the use of the key. If empty, no authentication is required. If multiple, any are allowed.",
          "items": {
            "type": "string",
            "description": "Allowed values are 'LSKF' and 'BIOMETRIC'. These values are meant to mimic the values used during the key generation process here.",
            "enum": ["LSKF", "BIOMETRIC"]
          },
          "default": []
        }
      }
    }
  },
  "required": ["proof_signing_alg_values_supported"]
}

این مثالی از شیء بیرونی proof_types_supported است:

{
  "credential_configurations_supported": {
    "org.iso.18013.5.1.mDL": {
      "format": "mso_mdoc",
      "doctype": "org.iso.18013.5.1.mDL",
      "cryptographic_binding_methods_supported": [
        "cose_key"
      ],
      "credential_signing_alg_values_supported": [
        -7, -9
      ],
      "proof_types_supported": {
        "android_keystore_attestation": {
          "proof_signing_alg_values_supported": [
            "ES256" // ecdsaWithSHA256
          ],
          "key_attestations_required" : {
            // OPTIONAL String - Representing the minimum accepted value for keyMintSecurityLevel values
            // defined here ("Software"|"TrustedEnvironment"|"StrongBox"). Default value: "TrustedEnvironment"
            "key_mint_security_level": "TrustedEnvironment",
            // OPTIONAL List of Strings - Representing all allowed values for userAuthType values defined here.
            // [] value will represent noAuthRequired. Default value: [].
            "user_auth_types": ["LSKF", "BIOMETRIC"]
          }
        }
      }
    }
  }
}

نگاشت ادعاهای گواهی VCI به Android Keystore

این جدول یک نگاشت اطلاعاتی ارائه می‌دهد تا به نهادهای آشنا با نوع استاندارد اثبات گواهی OpenID4VCI کمک کند تا بفهمند مفاهیم مشابه در کجای گواهی Android Keystore قرار دارند.

درخواست گواهی VCI

مکان android_keystore_attestation

محل ارزش مورد انتظار

ایس

کلید عمومی گواهی ریشه Keystore

ناموجود

آی تی

مقدار creationDateTime در افزونه‌ی attestation

ناموجود

تاریخ انقضا

فیلد validUntil در گواهی برگ

ناموجود

کلیدهای تایید شده

کلید عمومی موجود در گواهی برگ هر زنجیره

ناموجود

کلید_ذخیره_سازی

مقدار keyMintSecurityLevel در افزونه‌ی گواهی‌دهی

صادرکننده انتخاب شد: فیلد key_mint_security_level در فراداده صادرکننده

احراز هویت کاربر

مقادیر userAuthType و noAuthRequired در افزونه‌ی attestation

صادرکننده انتخاب شد: فیلد user_auth_types در فراداده صادرکننده

نانس

مقدار attestationChallenge در افزونه attestation

از پروتکل: مقدار c_nonce از نقطه پایانی nonce که در VCI شرح داده شده است

صدور گواهینامه

ناموجود

ناموجود

وضعیت

ناموجود

ناموجود