导入和导出密钥

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

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

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

本文档适用于在 Google Distributed Cloud (GDC) 网闸隔离配置中执行密钥管理操作的应用运维人员。如需了解详情,请参阅 GDC 网闸隔离配置文档的受众群体。

准备工作

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

申请 IAM 角色

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

  • KMS Key Import Admin (kms-keyimport-admin):创建、更新和删除 KeyImport 资源。
  • KMS Key Export Admin (kms-keyexport-admin):创建、更新和删除 KeyExport 资源。

准备环境

导入导出的密钥

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

  1. 创建一个 YAML 文件,并添加 KeyImport 资源作为 kind 对象的值:

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

    执行以下变量替换操作:

    • KEY_IMPORT_NAME:KeyImport 资源的名称,例如 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_NAME:KeyImport 资源名称,例如 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 对象的值,并添加以下内容:

    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_NAME:KeyExport 资源的名称,例如 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_NAME:KeyExport 资源的名称,例如 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 密钥和签名密钥之间。