Dijital kimlik bilgileri için donanım destekli onaylama uygulama

OpenID for Verifiable Credential Issuance (OpenID4VCI) spesifikasyonunun kullanıldığı tipik bir dijital kimlik bilgisi verme akışında, veren tarafın imzalanacak kimlik bilgisindeki anahtarın güvenli bir konumda saklandığını bilmesi gerekir. android_keystore_attestation kanıt türü (OpenID4VCI ile kullanılacak bir biçim), Android Keystore'dan donanım imzalı bir rapor sağlar. Bu rapor, anahtarın Güvenilir Yürütme Ortamı'nda (TEE) veya StrongBox'ta kilitlenmesini ve dışa aktarılamamasını ya da klonlanamamasını sağlar.

Donanım doğrulama işlemine genel bakış

Android anahtar deposunda bir anahtar oluşturulduğunda sistem, onay sertifikası oluşturabilir. Bu sertifika, cihazın donanımı tarafından korunan bir anahtarla imzalanır ve Google'ın elinde bulunan bir güven köküne geri döner.

android_keystore_attestation kanıtı, X.509 sertifika zincirleri dizisidir. Her zincir tek bir kimlik doğrulama anahtarını temsil eder ve yaprak sertifikası ile ara sertifikalar şeklinde yapılandırılır.

  • Yaprak sertifikası: Anahtarı ve Android'e özel bir onay uzantısını içerir.
  • Ara sertifikalar: Varlığı Android köküne bağlayın.

Doğrulama adımları

Düzenleyenler, onay üzerinde çeşitli doğrulamalar yapmalıdır.

  • Zincirde Android onay uzantısını içeren sertifikayı (genellikle yaprak sertifikası) bulun. Bu sertifika, Android Keystore tarafından oluşturulan anahtarın onay verilerini içerir.
  • Yeniden oynatma saldırılarını önlemek için uzantıdaki attestationChallenge alanının protokol tarafından sağlanan c_nonce ile eşleştiğini doğrulayın.
  • İlgilendiğiniz uzantılardaki tüm onaylamaların değerini doğrulayın.
  • Android anahtar deposu sertifikaları için iptal kontrolü gerçekleştirin.

Onay kanıtındaki değerler çeşitli kaynaklardan alınır:

  • Düzenleyen: Düzenleyen tarafından çeşitli değerler sağlanır ve en yaygın olanlar, sunum sırasında filtrelemeye olanak tanımak için düzenleyen meta veri biçimine yerleştirilir.
  • Sahip: Paket adı ve imza gibi değerler sahibinden alınır. Bunlar standart düzenleme prosedürleriyle paylaşılmaz ve sahibinden bağımsız olarak alınması gerekir.
  • Protokol: attestationChallenge ile nonce gibi değerler protokolden gelir.

Onay verilerini doğrulama hakkında daha ayrıntılı talimatlar için aşağıdaki kaynaklara bakın:

Onay kanıtı biçimi

Aşağıdaki örnekte, kimlik bilgisi isteğinde android_keystore_attestation kanıtı yer alıyor:

{
  "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
}

Daha sonra, kimlik bilgisi isteğinin proofs nesnesinde depolanır.

{
  "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
    ]
  }
}

Kart sağlayıcı meta veri biçimi

Bir veren, belirli bir kimlik bilgisi yapılandırması için android_keystore_attestation nesnesini proof_types_supported nesnesine dahil ederek desteklediği kanıt türlerini belirtir.

Aşağıda, ihraç edenler için android_keystore_attestation nesnesi örneği verilmiştir:

{
  "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"]
}

Bu, dıştaki proof_types_supported nesnesinin bir örneğidir:

{
  "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 onay taleplerini Android Keystore ile eşleme

Bu tablo, standart OpenID4VCI onay kanıtı türüne aşina olan kuruluşların benzer kavramların Android Keystore onayında nerede bulunduğunu anlamasına yardımcı olmak için bilgilendirici bir eşleme sağlar.

VCI onay talebi

android_keystore_attestation location

Beklenen değer konumu

iss

Anahtar deposu kök sertifikasının ortak anahtarı

Yok

iat

Onay uzantısında creationDateTime değeri

Yok

exp

Varlık sertifikasındaki validUntil alanı

Yok

attested_keys

Her zincirin yaprak sertifikasında bulunan ortak anahtar

Yok

key_storage

Onay uzantısında keyMintSecurityLevel değeri

Kart sağlayıcı seçildi: Kart sağlayıcı meta verilerindeki key_mint_security_level alanı

user_authentication

Onay uzantısındaki userAuthType ve noAuthRequired değerleri

Kart sağlayıcı seçildi: Kart sağlayıcı meta verilerindeki user_auth_types alanı

nonce

Onay uzantısında attestationChallenge değeri

Protokolden: VCI'da açıklanan nonce uç noktasından alınan c_nonce değeri

sertifika

Yok

Yok

status

Yok

Yok