Triển khai chứng thực dựa trên phần cứng cho thông tin xác thực kỹ thuật số

Trong quy trình phát hành thông tin xác thực kỹ thuật số điển hình bằng cách sử dụng thông số kỹ thuật OpenID cho việc phát hành thông tin xác thực có thể xác minh (OpenID4VCI), tổ chức phát hành cần biết rằng khoá trong thông tin xác thực cần ký được lưu trữ ở một vị trí an toàn. Loại bằng chứng android_keystore_attestation (một định dạng để sử dụng với OpenID4VCI) cung cấp một báo cáo được ký bằng phần cứng từ Kho khoá Android, đảm bảo khoá được khoá trong Môi trường thực thi đáng tin cậy (TEE) hoặc StrongBox và không thể xuất hoặc sao chép.

Tổng quan về chứng thực phần cứng

Khi một khoá được tạo trong Kho khoá Android, hệ thống có thể tạo một chứng chỉ chứng thực. Chứng chỉ này được ký bằng một khoá được bảo vệ bởi phần cứng của thiết bị, liên kết trở lại một Gốc tin cậy do Google nắm giữ.

Bằng chứng android_keystore_attestation là một mảng các chuỗi chứng chỉ X.509. Mỗi chuỗi đại diện cho một khoá xác thực duy nhất và được cấu trúc theo một chứng chỉ gốc, sau đó là các chứng chỉ trung gian.

  • Chứng chỉ gốc: Chứa khoá và tiện ích chứng thực dành riêng cho Android.
  • Chứng chỉ trung gian: Kết nối gốc với Gốc Android.

Các bước xác minh

Nhà phát hành nên thực hiện một số bước xác thực trên chứng thực.

  • Tìm chứng chỉ trong chuỗi có chứa tiện ích chứng thực Android (thường là chứng chỉ gốc). Chứng chỉ này chứa dữ liệu chứng thực cho khoá do Kho khoá Android tạo.
  • Xác minh rằng trường attestationChallenge trong tiện ích khớp với c_nonce do giao thức cung cấp để ngăn chặn các cuộc tấn công phát lại.
  • Xác minh giá trị của tất cả các câu khẳng định trong các tiện ích mà bạn quan tâm.
  • Thực hiện kiểm tra thu hồi đối với các chứng chỉ Kho khoá Android.

Các giá trị trong bằng chứng chứng thực đến từ nhiều nguồn:

  • Tổ chức phát hành: Tổ chức phát hành cung cấp nhiều giá trị và các giá trị phổ biến nhất được đưa vào định dạng siêu dữ liệu của tổ chức phát hành để cho phép lọc khi trình bày.
  • Người nắm giữ: Các giá trị như tên gói và chữ ký đến từ người nắm giữ. Các giá trị này không được chia sẻ thông qua các quy trình phát hành tiêu chuẩn và cần được lấy riêng từ người nắm giữ.
  • Giao thức: Các giá trị như nonce với attestationChallenge đến từ giao thức.

Để biết hướng dẫn đầy đủ hơn về cách xác thực dữ liệu chứng thực, hãy xem các tài nguyên sau:

Định dạng bằng chứng chứng thực

Trong yêu cầu thông tin xác thực, bằng chứng android_keystore_attestation được đưa vào ví dụ sau:

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

Sau đó, bằng chứng này được lưu trữ trong đối tượng proofs của yêu cầu thông tin xác thực.

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

Định dạng siêu dữ liệu của tổ chức phát hành

Nhà phát hành cho biết các loại bằng chứng mà nhà phát hành hỗ trợ bằng cách đưa đối tượng android_keystore_attestation vào đối tượng proof_types_supported cho một cấu hình thông tin xác thực nhất định.

Đây là ví dụ về đối tượng android_keystore_attestation cho nhà phát hành:

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

Đây là ví dụ về đối tượng proof_types_supported bên ngoài:

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

Ánh xạ các yêu cầu chứng thực VCI sang Kho khoá Android

Bảng này cung cấp thông tin ánh xạ để giúp các thực thể quen thuộc với loại bằng chứng chứng thực OpenID4VCI tiêu chuẩn hiểu được vị trí của các khái niệm tương tự trong chứng thực Kho khoá Android.

Yêu cầu chứng thực VCI

Vị trí android_keystore_attestation

Vị trí giá trị dự kiến

iss

Khoá công khai của chứng chỉ gốc Kho khoá

Không áp dụng

iat

Giá trị creationDateTime trong tiện ích chứng thực

Không áp dụng

exp

Trường validUntil trong chứng chỉ gốc

Không áp dụng

attested_keys

Khoá công khai có trong chứng chỉ gốc của mỗi chuỗi

Không áp dụng

key_storage

Giá trị keyMintSecurityLevel trong tiện ích chứng thực

Nhà phát hành đã chọn: trường key_mint_security_level trong siêu dữ liệu của nhà phát hành

user_authentication

Giá trị userAuthTypenoAuthRequired trong tiện ích chứng thực

Nhà phát hành đã chọn: trường user_auth_types trong siêu dữ liệu của nhà phát hành

nonce

Giá trị attestationChallenge trong tiện ích chứng thực

Từ giao thức: giá trị c_nonce từ điểm cuối nonce được mô tả trong VCI

certification

Không áp dụng

Không áp dụng

status

Không áp dụng

Không áp dụng