导入和导出密钥

本文档介绍了如何导入和导出密钥管理系统 (KMS) 密钥。这些操作使用 kubectl 命令行界面 (CLI),并与以下 Kubernetes 资源进行交互:

如需详细了解这些资源,请参阅 KMS API 概览

如需查看 KMS 支持的密钥的完整列表和详细信息,请参阅密钥 管理系统文档中的支持的密钥部分。

本文档适用于在 Google Distributed Cloud (GDC) 气隙环境中执行密钥管理操作的应用运维人员组内的受众。如需了解详情,请参阅 GDC 气隙环境文档的受众

准备工作

在导入或导出密钥之前,您必须拥有必要的权限并准备好环境。

请求 IAM 角色

请与您的组织 IAM 管理员联系,以请求在您的项目中拥有以下角色:

  • KMS 密钥导入管理员 (kms-keyimport-admin):创建、更新和删除 KeyImport 资源。
  • KMS 密钥导出管理员 (kms-keyexport-admin):创建、更新和删除 KeyExport 资源。

准备环境

导入导出的密钥

如需导入导出的密钥,请完成以下步骤:

  1. 创建一个 YAML 文件,并将 KeyImport 资源作为 kind 对象的 `value` 添加到该文件中:

    apiVersion: "kms.gdc.goog/v1"
    kind: KeyImport
    metadata:
      name: KEY_IMPORT_NAME
      namespace: PROJECT
    spec:
      context:
        mechanism: MECHANISM
    

    执行以下变量替换操作:

    • KEY_IMPORT_NAMEKeyImport 资源的名称,例如 key-import-test
    • PROJECT:项目 命名空间的名称,例如 kms-test1
    • MECHANISM:密钥的钥匙共享机制, 例如 `EDCH_P521_AES256`。
  2. 将 YAML 文件的内容应用于 KMS 并创建 KeyImport 资源:

    kubectl apply -f FILENAME.yaml
    

    FILENAME 替换为 YAML 文件的名称。

    借助内部生成的密钥对的公钥,KMS 会将 KeyImport 资源的状态更新为 AwaitingKeyToImport。如需继续,您需要查看资源的状态并获取 KMS 生成的公钥。

  3. 如需查看 KeyImport 资源的状态并获取 KMS 生成的公钥,请运行以下命令:

    kubectl describe keyimport KEY_IMPORT_NAME --namespace PROJECT
    

    执行以下变量替换操作:

    • KEY_IMPORT_NAMEKeyImport 资源名称,例如 key-import-test
    • PROJECT:项目命名空间的名称,例如 kms-test1

    运行该命令后,您会看到类似于以下内容的输出:

    ...
    Status:
      Conditions:
        Last Transition Time:  2022-12-14T20:43:50Z
        Message:               waiting for user to provide KeyToImport
        Observed Generation:   1
        Reason:                AwaitingKeyToImport
        Status:                False
        Type:                  Ready
      Imported Key Ref:
        Kind: KeyImport
        Name: key-import-test
      Peer Context:
        Private Key:
        Public Key: PUBLIC_KEY
    Events:           <none>
    

    PUBLIC_KEY 表示 KMS 生成的公钥 。复制该公钥,并在下一步中将其添加到 KeyExport 资源。

  4. 创建另一个 YAML 文件,将 KeyExport 资源作为 kind 对象的 `value` 添加到该文件中,并添加以下内容:

    apiVersion: "kms.gdc.goog/v1"
    kind: KeyExport
    metadata:
      name: KEY_EXPORT_NAME
      namespace: PROJECT
    spec:
      context:
        mechanism: MECHANISM
        publicKey: PUBLIC_KEY
      keyToExport:
        kind: KEY_PRIMITIVE
        name: KEY_NAME
    

    执行以下变量替换操作:

    • KEY_EXPORT_NAMEKeyExport 资源的名称,例如 key-export-test
    • PROJECT:项目命名空间的名称,例如 kms-test1

    • MECHANISM:密钥的钥匙共享机制, 例如 `EDCH_P521_AES256`。

    • PUBLIC_KEY:来自 keyImport.Status.PeerContext.PublicKey 的公钥。

    • KEY_PRIMITIVE:密钥的 CRD,例如 aeadkey 和 signingkey。

    • KEY_NAME:密钥的名称,例如 key-1

  5. 将 YAML 文件的内容应用于 KMS 并创建 KeyExport 资源:

    kubectl apply -f FILENAME.yaml
    

    FILENAME 替换为 YAML 文件的名称。

    运行该命令后,KMS 会更新 KeyExport 资源的状态并生成导出的密钥。如需获取导出的密钥,请查看资源的状态。

  6. 如需查看资源的状态,请运行以下命令:

    kubectl describe keyexport KEY_EXPORT_NAME --namespace PROJECT
    

    执行以下变量替换操作:

    • KEY_EXPORT_NAMEKeyExport 资源的名称,例如 key-export-test
    • PROJECT:项目命名空间的名称,例如 kms-test1

    运行该命令后,您会看到类似于以下内容的输出:

    ...
    Status:
    Conditions:
    Last Transition Time:  2022-12-14T20:45:57Z
    Message:               key successfully exported
    Observed Generation:   1
    Reason:                KeyExportCompleted
    Status:                True
    Type:                  Ready
    Exported Key: EXPORTED_KEY
    

    EXPORTED_KEY 表示导出的密钥的元数据。 复制 EXPORTED_KEY 中的内容,以继续执行 下一步。

  7. 修改包含 KeyImport 资源的 YAML 文件,并添加从 keyexport.status.exportedkey 的输出中复制的内容。

    apiVersion: "kms.gdc.goog/v1"
    kind: KeyImport
    metadata:
      name: key-import-test
      namespace: kms-test1
    spec:
      context:
        mechanism: EDCH_P521_AES256
      keyToImport: EXPORTED_KEY
    
  8. 修改 YAML 文件后,将内容应用于 KMS:

    kubectl apply -f FILENAME.yaml
    

    运行该命令后,KMS 会导入您提供的导出的密钥。

  9. 如需查看导入的密钥的详细信息,请运行以下命令:

    kubectl get keyimport KEY_IMPORT_NAME
    

    您将看到类似如下所示的输出:

    NAMESPACE   NAME             AGE    READY   REASON              KEY KIND
    kms-test1  KEY_IMPORT_NAME   60s    True    KeyImportCompleted  KEY_PRIMITIVE
    

    KEY_PRIMITIVE 表示您导入的密钥的类型,介于 AEAD 密钥和签名密钥之间。