将密钥导入到 Cloud KMS 中

本主题介绍了如何使用 gcloud 命令行工具自动封装和导入从 Cloud KMS 外部创建的密钥材料。

简介

利用 Cloud KMS,您可以导入用户提供的加密密钥。例如,您可能拥有在本地和/或多云端环境使用的现有密钥,以及一个密钥存储区(非 Cloud KMS)。 若要将现有密钥材料与 Cloud KMS 搭配使用,您可以导入那些密钥。

准备工作

  1. 本主题假定您已在使用 Cloud KMS。如果您尚未使用 Cloud KMS,请按照 Cloud KMS 快速入门中的步骤操作。

  2. 按照创建密钥环中的说明在支持 Cloud HSM 的区域中创建密钥环。

  3. 按照创建密钥中的说明创建保护级别为 HSM 的密钥。

  4. 为相应密钥环和密钥设置 Cloud Identity and Access Management 权限

  5. 安装 Pyca 加密库gcloud 命令行工具中的自动封装功能需要该库。

  6. 确保要导入的密钥采用正确的格式

密钥导入流程

导入流程

如需导入密钥,请执行以下操作:

  1. 创建导入作业。创建导入作业时,Cloud KMS 会生成一个公钥/私钥对。公钥用于在客户端上加密您的密钥材料,然后您可以将其发送到 Cloud KMS。私钥存储在 Cloud HSM 中,可防止 Google 在 Cloud HSM 之外解封装您的密钥材料。

    导入作业将在创建后的 3 天后到期,在此之前可以多次使用。到期后,Cloud KMS 将无法再导入或解封装任何与导入作业相对应的密钥材料。

  2. 发出导入请求。运行 gcloud 命令将产生以下结果:

    a. 自动下载用于导入作业的公钥。

    b. 在客户端上对您提供的密钥材料进行加密。

    c. 将加密的密钥材料传输到 Cloud KMS。

如果您希望自行封装密钥,而不是使用 gcloud 命令来封装,请改为按照导入预先封装的密钥中的说明进行操作。

创建导入作业

导入作业是 ImportJob 资源。创建导入作业时,您需要指定保护级别以及要用于封装密钥的导入方法

如需创建导入作业,请执行以下操作:

gcloud kms import-jobs create IMPORT_JOB \
  --location LOCATION \
  --keyring KEYRING_NAME \
  --import-method IMPORT_METHOD \
  --protection-level hsm

将 IMPORT_METHOD 替换为 rsa-oaep-3072-sha1-aes-256rsa-oaep-4096-sha1-aes-256

您可以选择使用有效的 KMS 位置来指定 LOCATION。您可以使用 gcloud kms locations list 获取位置值列表。

检查导入作业的状态

导入作业的初始状态为 PENDING_GENERATION。当状态变为 ACTIVE 时,导入作业便可供使用。

使用 describe 命令检查状态。您必须等到状态变为 ACTIVE 才能尝试导入密钥。

gcloud kms import-jobs describe IMPORT_JOB \
  --location LOCATION \
  --keyring KEYRING_NAME

您可以选择使用有效的 KMS 位置来指定 LOCATION。您可以使用 gcloud kms locations list 获取位置值列表。

发出导入密钥的请求

如需导入密钥,请执行以下操作:

gcloud kms keys versions import \
  --import-job IMPORT_JOB \
  --location LOCATION \
  --keyring KEYRING_NAME \
  --key KEY_NAME \
  --algorithm ALGORITHM_NAME \
  --target-key-file PATH_TO_KEY_TO_IMPORT

您可以选择使用 --public-key-file 标志指定包含导入作业的公钥的文件。如果未指定 --public-key-file,则 Cloud KMS 将从导入作业中检索公钥。

您可以选择使用有效的 KMS 位置来指定 LOCATION。您可以使用 gcloud kms locations list 获取位置值列表。

下面显示了 gcloud kms keys versions import 命令的输出结果。

algorithm: [ALGORITHM]
createTime: '2019-03-21T17:10:10.864211749Z'
generateTime: '2019-03-21T17:10:10.864211749Z'
name: projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING_NAME]/cryptoKeys/[KEY_NAME]/cryptoKeyVersions/1
protectionLevel: [PROTECTION_LEVEL]
state: ENABLED

检查导入密钥的状态

导入密钥的初始状态为 PENDING_IMPORT。当状态变为 ENABLED 时,导入密钥便可供使用。

使用 versions describe 命令检查状态。

gcloud kms keys versions describe VERSION \
  --location LOCATION \
  --keyring KEYRING_NAME \
  --key KEY_NAME

VERSION 的值是 name 值的最后一部分。

您可以选择将 LOCATION 替换为有效的 KMS 位置。您可以使用 gcloud kms locations list 获取位置值列表。

成功导入密钥后,其状态为 ENABLED,您可以通过 Cloud KMS 使用该密钥。

验证导入的密钥

导入密钥后,您可以验证密钥是否包含密钥材料以及其保护级别是否为 HSM。验证方式因导入到 Cloud KMS 中的密钥类型而异。

对称密钥

使用扩展的密钥校验和值 (EKCV) 密钥特性来验证密钥材料。此值系按照 RFC 5869 规范的第 2 节计算得出。该值的派生方式如下:使用基于 SHA-256 的 HMAC-based Extract-and-Expand Key Derivation Function (HKDF) 函数并以 32 个零字节作为盐值,然后使用固定字符串密钥校验值作为信息对其进行扩展。可以通过查看密钥的证明来检索此值。如需详细了解如何检查 EKCV 密钥特性 (attribute),请参阅验证密钥属性 (property)

非对称密钥

针对非对称密钥发出导入请求时,请在请求中包含封装的私钥。私钥包含供 Cloud KMS 派生公钥的足够信息。导入密钥后,您可以检索公钥并验证它与您本地存储的公钥是否匹配。如需详细了解如何检查公钥特性,请参阅验证公钥

您同样可以使用 EKCV 验证法来验证非对称密钥。在这种情况下,其值是 DER 编码的公钥的 SHA-256 摘要。您可以通过查看密钥的证明来检索此值。如需详细了解如何检查 EKCV 密钥特性 (attribute),请参阅验证密钥属性 (property)

如需详细了解如何证明您导入的密钥,请参阅验证证明