本主题介绍如何验证 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 控制台对证明进行验证,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 内是否创建了密钥版本。