Внедрить аппаратную аттестацию цифровых учетных данных.

В типичном процессе выдачи цифровых учетных данных с использованием спецификации 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

android_keystore_attestation location

Ожидаемое местоположение ценности

ис

Открытый ключ корневого сертификата хранилища ключей

Н/Д

иат

значение creationDateTime в расширении аттестации

Н/Д

эксп

Поле validUntil в конечном сертификате

Н/Д

attested_keys

Открытый ключ содержится в конечном сертификате каждой цепочки.

Н/Д

хранилище ключей

значение keyMintSecurityLevel в расширении аттестации

Выбранный эмитент: поле key_mint_security_level в метаданных эмитента.

пользовательская_аутентификация

Значения userAuthType и noAuthRequired в расширении аттестации

Выбранный эмитент: поле user_auth_types в метаданных эмитента.

однократно

значение attestationChallenge в расширении аттестации

Из протокола: значение c_nonce из конечной точки nonce , описанной в VCI.

сертификация

Н/Д

Н/Д

статус

Н/Д

Н/Д