对证明进行验证

本主题介绍如何验证 Cloud HSM 密钥的证明,这些密钥始终存储在硬件安全模块 (HSM) 中。

概览

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

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

下载证明语句和证书后,请验证证书集中的证书的有效性,然后验证证明语句本身。

证明语句的格式由 HSM 制造商定义。您无法使用 Cloud Console、Cloud KMS API 或 gcloud 工具对证明进行验证。验证有意独立于 Google 构建。

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

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

准备工作

下载工件

在对密钥进行证明之前,请先下载证书和证明语句。

下载证书

可以使用带有 Google 和 HSM 制造商的根证书的证书集来验证证明的签名,并且该证明可以由 Google 和 HSM 制造商的证书授权机构 (CA) 进行签署。

  1. 下载带有 Google 根证书的证书集。

    curl -O https://www.gstatic.com/cloudhsm/cloud-kms-prod-[location]-google.pem
    
  2. 下载带有 HSM 制造商根证书的证书集。

    curl -O https://www.gstatic.com/cloudhsm/cloud-kms-prod-[location]-cavium.pem
    
  3. 下载 Google 的根证书。

    curl -O https://www.gstatic.com/cloudhsm/roots/global_1498867200.pem
    
  4. 下载并提取 HSM 制造商的根证书和公钥。

    curl -O https://www.marvell.com/content/dam/marvell/en/public-collateral/security-solutions/liquid_security_certificate.zip
    
    unzip liquid_security_certificate.zip
    

    系统会将该证书提取到 liquid_security_certificate.crt,并将公钥提取到 liquid_security_certificate.txt

下载证明语句

您可以使用 Google Cloud Console 或命令行下载加密密钥版本的证明。证明语句可以直接从包含密钥的 HSM 设备下载。

控制台

  1. 转到 Cloud Console 中的加密密钥页面。

    转到“加密密钥”页面

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

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

  4. 获取证明对话框中,点击下载。认证文件将下载到您的本地系统上。

    证明文件名称的格式为 [keyring-name]-[key-name]-[key-version]-[attestation-format]-attestation.dat。 文件名的每个部分由连字符分隔。因此,用方括号([])字符括起占位符文本。

gcloud

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

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

    Cloud Shell 会话

  2. 在 Cloud Shell 命令行提示符处,使用 gcloud kms keys versions describe 命令检索要证明的密钥的证明格式。

    gcloud kms keys versions describe key-version \
      --key key-name \
      --location location \
      --keyring keyring-name
    

    此命令的输出显示密钥版本的证明格式,您将在下一步中使用该格式。

  3. 在 Cloud Shell 命令行提示符处,使用 gcloud kms keys versions describe 命令检索要证明的密钥的证明,将 attestation-format 替换为您在上一步中检索的证明格式。--attestation-file 标志为检索到的证明指定路径地址和文件名格式。文件名的每个部分由连字符分隔。因此,用方括号([])字符括起占位符文本。

    gcloud kms keys versions describe key-version \
     --key key-name \
     --location location \
     --keyring keyring-name \
     --attestation-file \
     [keyring-name]-[key-name]-[key-version]-[attestation-format]-attestation.dat
    

验证证明的签名

要验证证明的加密签名,您可以使用开源脚本

您也可以验证非对称密钥对的公钥

解析证明的值

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。您可以使用 Cloud Console 获取密钥版本的资源 ID,也可以运行以下命令来获取:

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

    RESOURCE_NAME="projects/project-id/locations/location/keyRings/key-ring-name/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 内是否创建了密钥版本。由于验证有意独立于 Google,因此您无法使用 Cloud Console、Cloud KMS API 或 gcloud 工具来验证证明。