В типичном процессе выдачи цифровых учетных данных с использованием спецификации OpenID for Verifiable Credential Issuance (OpenID4VCI) эмитенту необходимо знать, что ключ, содержащийся в подписываемых учетных данных, хранится в безопасном месте. Тип подтверждения android_keystore_attestation — формат для использования с OpenID4VCI — предоставляет отчет, подписанный аппаратным обеспечением, из хранилища ключей Android , гарантируя, что ключ заблокирован в доверенной среде выполнения (TEE) или защищенном хранилище (StrongBox) и не может быть экспортирован или клонирован.
Обзор аттестации оборудования
Когда ключ генерируется в хранилище ключей Android, система может создать сертификат подтверждения. Этот сертификат подписывается ключом, защищенным аппаратным обеспечением устройства, который связан с корневым доверенным хранилищем, хранящимся в Google.
Доказательство android_keystore_attestation представляет собой массив цепочек сертификатов X.509. Каждая цепочка представляет собой отдельный ключ аутентификации и структурирована следующим образом: сначала идет конечный сертификат, а затем промежуточные сертификаты.
- Конечный сертификат : содержит ключ и расширение для аттестации, специфичное для Android.
- Промежуточные сертификаты : Подключите конечный узел к корневому каталогу Android.
Этапы проверки
Эмитенты должны провести несколько проверок аттестации.
- Найдите в цепочке сертификат, содержащий расширение аттестации Android (обычно это конечный сертификат). Этот сертификат содержит данные аттестации для ключа, созданного хранилищем ключей Android.
- Убедитесь, что поле
attestationChallengeв расширении соответствует значениюc_nonceпредоставленному протоколом, чтобы предотвратить атаки повторного воспроизведения.
- Проверьте значения всех утверждений в интересующих вас расширениях.
- Выполните проверку отзыва сертификатов в хранилище ключей Android.
Значения в подтверждающем документе получены из нескольких источников:
- Эмитент: Эмитент предоставляет различные значения, и наиболее распространенные из них помещаются в формат метаданных эмитента, что позволяет осуществлять фильтрацию при отображении.
- Владелец: Такие данные, как наименование посылки и подпись, предоставляются владельцем. Эти данные не передаются в рамках стандартных процедур выдачи и должны быть получены от владельца самостоятельно.
- Протокол: Такие значения, как 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.
В этой таблице представлена информационная схема, которая поможет организациям, знакомым со стандартным типом подтверждения аттестации OpenID4VCI, понять, где находятся аналогичные концепции в рамках аттестации хранилища ключей Android.
Заявление о подтверждении VCI | | Ожидаемое местоположение ценности |
ис | Открытый ключ корневого сертификата хранилища ключей | Н/Д |
иат | значение | Н/Д |
эксп | Поле | Н/Д |
attested_keys | Открытый ключ содержится в конечном сертификате каждой цепочки. | Н/Д |
хранилище ключей | значение | Выбранный эмитент: поле |
пользовательская_аутентификация | Значения | Выбранный эмитент: поле |
однократно | значение | Из протокола: значение |
сертификация | Н/Д | Н/Д |
статус | Н/Д | Н/Д |