در یک جریان صدور گواهی دیجیتال معمولی با استفاده از مشخصات 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 | مکان | محل ارزش مورد انتظار |
ایس | کلید عمومی گواهی ریشه Keystore | ناموجود |
آی تی | مقدار | ناموجود |
تاریخ انقضا | فیلد | ناموجود |
کلیدهای تایید شده | کلید عمومی موجود در گواهی برگ هر زنجیره | ناموجود |
کلید_ذخیره_سازی | مقدار | صادرکننده انتخاب شد: فیلد |
احراز هویت کاربر | مقادیر | صادرکننده انتخاب شد: فیلد |
نانس | مقدار | از پروتکل: مقدار |
صدور گواهینامه | ناموجود | ناموجود |
وضعیت | ناموجود | ناموجود |