本主题介绍如何验证 Cloud HSM 密钥的证明,这些密钥始终存储在硬件安全模块 (HSM) 中。
概览
在加密中,“证明”是由软件片段构成的一种机器可读且可通过编程方式验证的语句。证明是可信计算的重要组成部分,可用于实现合规。
要查看和验证证明,您需要一个来自 HSM 经过加密签名的证明语句以及用于对其进行签署的证书链。证明语句由 HSM 硬件生成,并由 Google 和 HSM 制造商拥有的证书进行签署。
下载证明语句和证书链后,您可以检查其特性或使用证书链验证证明的有效性。
证明脚本是由 Google 开发的开源 Python 脚本。您可以查看该脚本的源代码,以详细了解证明格式和验证的工作原理,或作为自定义解决方案的模型。
本主题中的示例专为 Linux 环境(包括 Cloud Shell)设计。如需在 macOS 或 Windows 客户端上使用,您可能需要进行修改。
准备工作
- 如有必要,请在 Cloud HSM 支持的地区中的密钥环上创建 Cloud HSM 密钥。
从 HSM 制造商下载并安装用于解析证明的值的脚本。下载以下每个脚本:
verify_pubkey.py
parse_v1.py
parse_v2.py
查看在同一位置提供的脚本使用文档。
下载并安装用于验证证明的脚本及其前提条件,并查看该脚本的文档。
验证证明
可以通过 Google Cloud 控制台自动执行证明验证过程,也可以手动下载证明包和证明验证脚本,并在本地或 Cloud Shell 中运行该脚本。
通过 Google Cloud 控制台验证证明
您可以通过 Google Cloud 控制台验证证明, 打开 Cloud Shell,然后使用所需的代码段 执行整个证明验证流程。
转到 Google Cloud 控制台中的密钥管理页面。
选择包含您要证明的密钥的密钥环,然后选择密钥。
对于要证明的密钥版本,点击更多 more_vert,然后选择验证证明。
在验证证明对话框中,点击打开 Cloud Shell。这将打开 Cloud Shell 并预先填充通过整个验证过程所需的代码段。
在 Cloud Shell 中检查预先填充的代码段。该代码段会下载证明验证脚本及其依赖项,运行 gcloud 命令以下载证明和证书链,然后运行脚本以验证证明。
运行代码段以验证证明。
手动验证证明
需要下载证明、证书链和证明验证脚本,然后再手动验证证明。
下载证明和证书链。
控制台
转到 Google Cloud 控制台中的密钥管理页面。
选择包含您要证明的密钥的密钥环,然后选择密钥。
对于要证明的密钥版本,点击更多 more_vert,然后选择验证证明。
在验证证明对话框中,点击下载证明包。 这将下载包含证明和证书链的 zip 文件。
从证明包中提取证明和证书链。
gcloud
点击控制台窗口顶部的激活 Cloud Shell。
一个 Cloud Shell 会话随即会在控制台底部的新框内打开,并显示命令行提示符。该 Shell 会话可能需要几秒钟才能完成初始化。
在 Cloud Shell 命令行提示符处,使用
gcloud kms keys versions describe
命令检索要证明的密钥的证明。--attestation-file
标志为检索到的证明指定路径地址和文件名格式。gcloud kms keys versions describe key-version \ --key key-name \ --location location \ --keyring keyring-name \ --attestation-file [attestation-file] \
在 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 keyring-name \ --output-file [certificates-file] \
解析证明的值
HSM 制造商文档 包含有关如何使用其脚本来解析证明的 值并验证非对称密钥对的公钥。在解析证明之前,需要使用以下命令对其进行解压缩。
解压缩压缩的证明。
gzip -d < compressed_attestation.dat > attestation.dat
以下链接直接指向 HSM 制造商提供的具体说明:
解析证明的值的说明包括证明中常规字段的参考,并非特定于 Cloud HSM 中的 HSM 密钥的字段。
以下各个部分说明了如何验证特定于 Cloud HSM 的密钥信息。
验证密钥的版本 ID
您可以验证证明中是否存在密钥版本资源 ID 的 SHA-256 哈希。密钥的资源名称是证明文件中 0x0102
字段或密钥 ID 字段的一部分。密钥 ID 由两个十六进制格式的串联 SHA-256 哈希摘要组成。第二个摘要应该与密钥的资源名称匹配。
获取密钥版本的资源 ID。您可以使用 使用 Google Cloud 控制台获取密钥版本资源 ID,或 您可以运行以下命令:
gcloud kms keys versions list \ --location location \ --keyring key-ring-name \ --key key-name
在命令行中,将
resource_name
分配给刚刚检索的密钥版本资源 ID。RESOURCE_NAME="projects/project-id/locations/location/keyRings/key-ring-name/cryptoKeys/key-name/cryptoKeyVersions/key-version"
由于解析脚本会以十六进制格式转储所有证明字段,因此密钥 ID 将转换为十六进制格式两次(一次是在创建密钥 ID 时,另一次是在解析证明时)。如需验证资源名称是否与密钥 ID 匹配,请将资源名称转换为 SHA-256 十六进制摘要,然后还原一次证明文件中的密钥 ID 的十六进制转换,最后对这两者进行比较。
RESOURCE_NAME_HEX="$(echo -n ${RESOURCE_NAME} | openssl dgst -sha256 -hex | awk '{print $2}')"
解析脚本会以十六进制格式转储所有证明字段,且密钥 ID 再次成为在内部以十六进制编码的值。将
KEYID_HEX
环境变量设置为具有一层解码的十六进制编码层的密钥 ID 的值:KEYID_HEX=$(grep -m 1 0x0102 /path/to/parsed/attestation.dat | awk '{print $2}' | xxd -p -r)
将
RESOURCE_NAME_HEX
和KEYID_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 内是否创建了密钥版本。