验证证明

本指南介绍如何验证 Cloud HSM 密钥的证明,这些密钥始终存储在硬件安全模块 (HSM) 中。本指南同时适用于多租户 Cloud HSM 和单租户 Cloud HSM 密钥。

概览

在加密中,“证明”是由软件片段构成的一种机器可读且可通过编程方式验证的语句。证明是可信计算的重要组成部分,可用于实现合规。

要查看和验证证明,您需要一个来自 HSM 经过加密签名的证明语句以及用于对其进行签署的证书链。证明语句由 HSM 硬件生成,并由 Google 和 HSM 制造商拥有的证书进行签署。

下载证明语句和证书链后,您可以检查其特性或使用证书链验证证明的有效性

证明脚本是由 Google 开发的开源 Python 脚本。您可以查看该脚本的源代码,以详细了解证明格式和验证的工作原理,或作为自定义解决方案的模型。

本文档中的示例专为 Linux 环境(包括 Cloud Shell)设计。如需在 macOS 或 Windows 客户端上使用,您可能需要进行修改。

准备工作

验证证明

可以通过 Google Cloud 控制台自动执行证明验证过程,也可以手动下载证明包和证明验证脚本,并在本地或 Cloud Shell 中运行该脚本。

使用 Google Cloud 控制台验证证明

您可以通过 Google Cloud 控制台验证证明,该控制台将打开 Cloud Shell 并预先填充执行整个证明验证过程所需的代码段。

  1. 在 Google Cloud 控制台中,前往密钥管理页面。

    前往 Key Management

  2. 选择包含您要证明的密钥的密钥环,然后选择密钥。

  3. 对于要证明的密钥版本,点击更多 ,然后选择验证证明

  4. 验证证明对话框中,点击打开 Cloud Shell。这将打开 Cloud Shell 并预先填充通过整个验证过程所需的代码段。

  5. 在 Cloud Shell 中检查预先填充的代码段。该代码段会下载证明验证脚本及其依赖项,运行 gcloud CLI 命令以下载证明和证书链,然后运行脚本以验证证明。

  6. 运行代码段以验证证明。

手动验证证明

需要下载证明、证书链和证明验证脚本,然后再手动验证证明。

  1. 下载证明和证书链。

    控制台

    1. 在 Google Cloud 控制台中,前往密钥管理页面。

      前往 Key Management

    2. 选择包含您要证明的密钥的密钥环,然后选择密钥。

    3. 对于要证明的密钥版本,点击更多 ,然后选择验证证明

    4. 验证证明对话框中,点击下载证明包。 这将下载包含证明和证书链的 zip 文件。

    5. 从证明包中提取证明和证书链。

    gcloud

    1. 点击控制台窗口顶部的激活 Cloud Shell

      一个 Cloud Shell 会话随即会在控制台底部的新框内打开,并显示命令行提示符。该 Shell 会话可能需要几秒钟才能完成初始化。

    2. 在 Cloud Shell 命令行提示符处,使用 gcloud kms keys versions describe 命令检索要证明的密钥的证明。--attestation-file 标志为检索到的证明指定路径地址和文件名格式。

      gcloud kms keys versions describe KEY_VERSION \
       --key KEY_NAME \
       --location LOCATION \
       --keyring KEY_RING \
       --attestation-file ATTESTATION_FILE_PATH \
      
    3. 在 Cloud Shell 命令行提示符处,使用 gcloud kms keys versions get-certificate-chain 命令检索要证明的密钥的证书链。--output-file 标志为检索到的证书指定路径地址和文件名格式。

      gcloud kms keys versions get-certificate-chain KEY_VERSION \
       --key KEY_NAME \
       --location LOCATION \
       --keyring KEY_RING \
       --output-file CERTIFICATE_FILE_PATH \
      
  2. 下载用于验证证明的脚本及其前提条件,并参阅脚本的文档,以使用证书文件中的证书来验证证明文件中的证明。

解析证明的值

HSM 制造商的文档包含使用其脚本解析证明的值以及验证非对称密钥对的公钥的完整说明。在解析证明之前,需要使用以下命令对其进行解压缩。

  • 提取压缩的证明。

    gzip -d < compressed_attestation.dat > attestation.dat
    

以下链接直接指向 HSM 制造商提供的具体说明:

解析证明的值的说明包括证明中常规字段的参考,并非特定于 Cloud HSM 中的 HSM 密钥的字段。

以下各个部分说明了如何验证特定于 Cloud HSM 的密钥信息。

验证密钥的版本 ID

您可以验证证明中是否存在密钥版本资源 ID 的 SHA-256 哈希。密钥的资源名称是证明文件中 0x0102 字段或密钥 ID 字段的一部分。密钥 ID 由两个十六进制格式的串联 SHA-256 哈希摘要组成。第二个摘要应该与密钥的资源名称匹配。

  1. 获取密钥版本的资源 ID。您可以使用Google Cloud 控制台获取密钥版本资源 ID,也可以运行以下命令来获取:

    gcloud kms keys versions list \
       --location LOCATION \
       --keyring KEY_RING \
       --key KEY_NAME
    
  2. 在命令行中,将 resource_name 分配给刚刚检索的密钥版本资源 ID。

    RESOURCE_NAME="projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION"
    
  3. 由于解析脚本会以十六进制格式转储所有证明字段,因此密钥 ID 将转换为十六进制格式两次(一次是在创建密钥 ID 时,另一次是在解析证明时)。如需验证资源名称是否与密钥 ID 匹配,请将资源名称转换为 SHA-256 十六进制摘要,然后还原一次证明文件中的密钥 ID 的十六进制转换,最后对这两者进行比较。

    RESOURCE_NAME_HEX="$(echo -n ${RESOURCE_NAME} | openssl dgst -sha256 -hex | awk '{print $2}')"
    
  4. 解析脚本会以十六进制格式转储所有证明字段,且密钥 ID 再次成为在内部以十六进制编码的值。将 KEYID_HEX 环境变量设置为具有一层解码的十六进制编码层的密钥 ID 的值:

    KEYID_HEX=$(grep -m 1 0x0102 /path/to/parsed/attestation.dat | awk '{print $2}' | xxd -p -r)
    
  5. RESOURCE_NAME_HEXKEYID_HEX 的值作为字符串进行比较:

    test ${RESOURCE_NAME_HEX} == ${KEYID_HEX:(-64)} || echo "Values don't match"
    

    如果有其他值与它们匹配,则不返回任何输出,且命令会退出,代码为 0

验证密钥的其他属性

您可以查看与 PKCS #11 标准中的字段相对应的各种密钥属性。使用以下示例作为指南来验证密钥的其他属性。

  • 密钥是否可提取存储在已解析输出的 0x0102 字段中。如需确定密钥是否可提取,请检查 0x0162 字段。\x01 的值为 true,而 \x00 的值为 false

    Cloud HSM 密钥无法提取。

    grep '0x0162:' /path/to/parsed/attestation.dat
    
  • 密钥如何进入 HSM(无论是直接创建还是导入)存储在 0x0163 字段中。如果 HSM 上的密钥是在本地创建的,则该字段设置为 \x01。已导入密钥的字段设置为 \x00

    您可以根据密钥进入 HSM 的运行方式推断出一些信息。如果密钥是在 Cloud HSM 中创建的,则意味着该密钥从未以未加密的形式存储在 HSM 外部。如果密钥是导入的,则在传输过程中,该密钥会受到导入作业封装密钥的保护,之后会一直保留在 Cloud HSM 中。

    grep '0x0163:' /path/to/parsed/attestation.dat
    
  • 密钥的类型存储在 0x0100 字段中。密钥类型记录在 PCKS#11 标准中,前缀为 CKK_*。例如,AES 密钥类型为 \x1f

    grep '0x0100:' /path/to/parsed/attestation.dat
    

其他信息

您可以对证明进行验证,以确定 HSM 内是否创建了密钥版本。