تنفيذ التأكيد عن بُعد المستند إلى الأجهزة لبيانات الاعتماد الرقمية

في عملية إصدار بيانات اعتماد رقمية نموذجية باستخدام مواصفات OpenID لإصدار بيانات الاعتماد القابلة للتحقّق (OpenID4VCI)، يجب أن يعرف جهة الإصدار أنّ المفتاح داخل بيانات الاعتماد المطلوب توقيعها مخزّن في مكان آمن. يوفر نوع المستند android_keystore_attestation، وهو تنسيق مخصّص للاستخدام مع OpenID4VCI، تقريرًا موقّعًا من المعدّات من مخزن مفاتيح Android، ما يضمن قفل المفتاح في بيئة تنفيذ موثوقة (TEE) أو StrongBox وعدم إمكانية تصديره أو استنساخه.

نظرة عامة على خدمة "إثبات صحة الجهاز"

عند إنشاء مفتاح في Android Keystore، يمكن للنظام إنشاء شهادة إثبات صحة. هذه الشهادة موقَّعة بمفتاح محمي بواسطة أجهزة الجهاز، ويتم ربطها بجذر موثوق به تحتفظ به Google.

android_keystore_attestation الإثبات هو مجموعة من سلاسل شهادات X.509. تمثّل كل سلسلة مفتاح مصادقة واحدًا، ويتم تنظيمها من خلال شهادة ورقة تليها شهادات وسيطة.

  • شهادة الخصائص التفصيلية: تحتوي على المفتاح وإضافة خاصة بشهادة المصادقة على Android.
  • الشهادات المتوسطة: تربط الشهادة غير المخوّلة للتصديق بشهادة الجذر في Android.

خطوات إثبات الهوية

على الجهات المصدرة إجراء عمليات تحقّق متعدّدة من شهادة الإقرار.

  • ابحث عن الشهادة في السلسلة التي تحتوي على إضافة بيان صحة الجهاز على Android (عادةً ما تكون شهادة الورقة الأخيرة). تحتوي هذه الشهادة على بيانات التصديق الخاصة بالمفتاح الذي أنشأه Android Keystore.
  • تأكَّد من أنّ الحقل attestationChallenge في الإضافة يتطابق مع c_nonce الذي يوفّره البروتوكول لمنع هجمات إعادة الإرسال.
  • تحقَّق من قيمة جميع التأكيدات في الإضافات التي تهمّك.
  • إجراء عملية تحقّق من الإبطال مقابل شهادات "مخزن مفاتيح Android"

تأتي القيم الواردة في مستند إثبات صحة الشهادة من عدة مصادر:

  • الجهة المصدرة: تقدّم الجهة المصدرة قيمًا مختلفة، ويتم وضع القيم الأكثر شيوعًا في تنسيق البيانات الوصفية للجهة المصدرة للسماح بالفلترة أثناء العرض.
  • الجهة المالكة: يتم الحصول على قيم مثل اسم الحزمة والتوقيع من الجهة المالكة. ولا تتم مشاركة هذه المستندات من خلال إجراءات الإصدار العادية، بل يجب الحصول عليها بشكل مستقل من صاحبها.
  • البروتوكول: تأتي القيم، مثل الرقم العشوائي مع 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"]
          }
        }
      }
    }
  }
}

ربط بيانات مصادقة مستند تعريف المركبة بـ "مخزن مفاتيح Android"

يقدّم هذا الجدول عملية ربط معلوماتية لمساعدة الجهات التي تعرف نوع إثبات صحة البيانات المتوافق مع معيار OpenID4VCI على فهم الأماكن التي تتوفّر فيها المفاهيم المشابهة ضمن عملية إثبات صحة البيانات في Android Keystore.

مطالبة شهادة VCI

android_keystore_attestation الموقع الجغرافي

موقع القيمة المتوقّعة

iss

المفتاح العام لشهادة الجذر في ملف تخزين المفاتيح

لا ينطبق

iat

قيمة creationDateTime في إضافة شهادة الاعتماد

لا ينطبق

exp

حقل validUntil في الشهادة غير المخوّلة للتصديق

لا ينطبق

attested_keys

المفتاح العام المُضمَّن في شهادة العنصر الأخير من كل سلسلة

لا ينطبق

key_storage

قيمة keyMintSecurityLevel في إضافة شهادة الاعتماد

حقل "جهة الإصدار المحدّدة: key_mint_security_level" في البيانات الوصفية لجهة الإصدار

user_authentication

قيم userAuthType وnoAuthRequired في إضافة شهادة الإقرار

حقل "جهة الإصدار المحدّدة: user_auth_types" في البيانات الوصفية لجهة الإصدار

nonce

قيمة attestationChallenge في إضافة شهادة الاعتماد

من البروتوكول: قيمة c_nonce من نقطة نهاية nonce الموضّحة في VCI

شهادة الاعتماد

لا ينطبق

لا ينطبق

status

لا ينطبق

لا ينطبق