

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在外部密钥存储中创建 KMS 密钥
<a name="create-xks-keys"></a>

[创建](create-xks-keystore.md)并[连接](xks-connect-disconnect.md)外部密钥存储库后，可以在密钥库 AWS KMS keys 中创建。它们必须是源值为**外部密钥存储**（`EXTERNAL_KEY_STORE`）的[对称加密 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)。您不能在自定义密钥存储中创建[非对称 KMS 密钥](symmetric-asymmetric.md)、[HMAC KMS 密钥](hmac.md)或具有[导入的密钥材料](importing-keys.md)的 KMS 密钥。此外，您不能在自定义密钥存储中使用对称加密 KMS 密钥来生成非对称数据密钥对。

与标准 KMS 密钥相比，外部密钥存储中 KMS 密钥的延迟、耐久性和可用性可能较差，因为这些密钥依赖位于 AWS外部的组件。在外部密钥存储中创建或使用 KMS 密钥之前，请验证您是否需要具有外部密钥存储属性的密钥。

**注意**  
一些外部密钥管理器为在外部密钥存储中创建 KMS 密钥提供了更简单的方法。有关详细信息，请参阅外部密钥管理器的文档。

若要在外部密钥存储中创建 KMS 密钥，请指定以下内容：
+ 外部密钥存储的 ID。
+ 外部密钥存储（`EXTERNAL_KEY_STORE`）的[密钥材料源](create-keys.md#key-origin)。
+ 与外部密钥存储关联的[外部密钥管理器](keystore-external.md#concept-ekm)中现有[外部密钥](keystore-external.md#concept-external-key)的 ID。此外部密钥用作 KMS 密钥的密钥材料。创建 KMS 密钥后，您无法更改外部密钥 ID。

  AWS KMS 在请求加密和解密操作时，向您的外部密钥存储代理提供外部密钥 ID。 AWS KMS 无法直接访问您的外部密钥管理器或其任何加密密钥。

除了外部密钥外，外部密钥存储中的 KMS 密钥还包含 AWS KMS 密钥材料。在 KMS 密钥下加密的所有数据首先 AWS KMS 使用密钥的密 AWS KMS 钥材料进行加密，然后由您的外部密钥管理器使用您的外部密钥进行加密。这种[双重加密](keystore-external.md#concept-double-encryption)过程可确保外部密钥存储中受 KMS 密钥保护的加密文字至少与仅受 AWS KMS保护的加密文字一样强大。有关更多信息，请参阅 [外部密钥存储的工作原理](keystore-external.md#xks-how-it-works)。

`CreateKey` 操作成功后，新 KMS 密钥的[密钥状态](key-state.md)为 `Enabled`。[查看外部密钥存储中的 KMS 密钥](identify-key-types.md#view-xks-key)时，您可以看到各种典型属性，例如其密钥 ID、[密钥规范](create-keys.md#key-spec)、[密钥用法](create-keys.md#key-usage)、[密钥状态](key-state.md)以及创建日期。但是您也可以看到外部密钥存储的 ID 和[连接状态](xks-connect-disconnect.md#xks-connection-state)以及外部密钥的 ID。

如果您在外部密钥存储中创建 KMS 密钥的尝试失败，请查看错误消息以确定原因。错误消息可能表明外部密钥存储未连接（`CustomKeyStoreInvalidStateException`），您的外部密钥存储代理无法找到具有指定外部密钥 ID（`XksKeyNotFoundException`）的外部密钥，或者外部密钥已与同一外部密钥存储 `XksKeyAlreadyInUseException` 中的 KMS 密钥相关联。

有关在外部密钥存储中创建 KMS 密钥的操作 AWS CloudTrail 日志的示例，请参阅[CreateKey](ct-createkey.md)。

**Topics**
+ [外部密钥存储中 KMS 密钥的要求](#xks-key-requirements)
+ [在外部密钥存储中创建新的 KMS 密钥](#create-key-xks)

## 外部密钥存储中 KMS 密钥的要求
<a name="xks-key-requirements"></a>

若要在外部密钥存储中创建 KMS 密钥，外部密钥存储、KMS 密钥和用作 KMS 密钥外部加密密钥材料的外部密钥需要具有以下属性。

**外部密钥存储要求**
+ 必须连接到其外部密钥存储代理。

  若要查看外部密钥存储的[连接状态](xks-connect-disconnect.md#xks-connection-state)，请参阅 [查看外部密钥存储](view-xks-keystore.md)。若要连接外部密钥存储，请参阅 [连接和断开外部密钥存储](xks-connect-disconnect.md)。

**KMS 密钥要求**

创建 KMS 密钥后，您无法更改这些属性。
+ 密钥规范：SYMMETRIC\$1DEFAULT
+ 密钥用法：ENCRYPT\$1DECRYPT
+ 密钥材料源：EXTERNAL\$1KEY\$1STORE
+ 多区域：FALSE

**外部密钥要求**
+ 256 位 AES 加密密钥（256 个随机位）。`KeySpec` 的外部密钥必须是 `AES_256`。
+ 已启用并可供使用。`Status` 的外部密钥必须是 `ENABLED`。
+ 已配置以进行密钥和解密。`KeyUsage` 的外部密钥必须包含 `ENCRYPT` 和 `DECRYPT`。
+ 仅与此 KMS 密钥结合使用。外部密钥存储中的每个 `KMS key` 都必须与不同的外部密钥关联。

  AWS KMS 还建议将外部密钥专门用于外部密钥存储。此限制更易于识别和解决密钥问题。
+ 可由外部密钥存储的[外部密钥存储代理](keystore-external.md#concept-xks-proxy)访问。

  如果外部密钥存储代理无法使用指定的外部密钥 ID 找到密钥，则 `CreateKey` 操作将失败。
+ 可以处理您的使用 AWS 服务 产生的预期流量。 AWS KMS 建议准备好外部密钥以每秒最多处理 1800 个请求。

## 在外部密钥存储中创建新的 KMS 密钥
<a name="create-key-xks"></a>

您可以在 AWS KMS 控制台或使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作在外部密钥存储中创建新的 KMS 密钥。

### 使用控制 AWS KMS 台
<a name="create-xks-key-console"></a>

有两种方法可以在外部密钥存储中创建 KMS 密钥。
+ 方法 1（推荐）：选择外部密钥存储，然后在该外部密钥存储中创建 KMS 密钥。
+ 方法 2：创建 KMS 密钥，然后指明该密钥在外部密钥存储中。

如果您使用方法 1，即在创建密钥之前选择外部密钥存储，请为您 AWS KMS 选择所有必需的 KMS 密钥属性并填写外部密钥存储的 ID。此方法可让您避免在创建 KMS 密钥时可能犯的错误。

**注意**  
不要在别名、描述或标签中包含机密或敏感信息。这些字段可能以纯文本形式出现在 CloudTrail 日志和其他输出中。

**方法 1（推荐）：在外部密钥存储中开始**

若要使用此方法，请选择您的外部密钥存储，然后创建 KMS 密钥。 AWS KMS 控制台为您选择所有必需的属性并填写您的外部密钥存储库的 ID。此方法可让您避免在创建 KMS 密钥时可能犯的许多错误。

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/km](https://console.aws.amazon.com/kms) s 处打开 AWS Key Management Service (AWS KMS) 控制台。

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 在导航窗格中，选择 **Custom key stores**（自定义密钥存储）、**External key stores**（外部密钥存储）。

1. 选择外部密钥存储的名称。

1. 在右上角，选择 **Create a KMS key in this key store**（在此密钥存储中创建 KMS 密钥）。

   如果*未*连接外部密钥存储，系统将提示您将其连接。如果连接尝试失败，则需要解决问题并连接外部密钥存储，然后才能在其中创建新的 KMS 密钥。

   如果已连接外部密钥存储，您将被重定向到 **Customer managed keys**（客户托管密钥）页面以创建密钥。已为您选择了必需的 **Key configuration**（密钥配置）值。此外，外部密钥存储的自定义密钥存储 ID 已填写，但您可以对其进行更改。

1. 在[外部密钥管理器](keystore-external.md#concept-ekm)中输入[外部密钥](keystore-external.md#concept-external-key)的密钥 ID。此外部密钥必须[满足与 KMS 密钥一起使用的要求](#xks-key-requirements)。创建 KMS 密钥后，您无法更改此值。

   如果外部密钥有多个 IDs，请输入外部密钥存储代理用来识别外部密钥的密钥 ID。

1. 请确认您打算在指定的外部密钥存储中创建 KMS 密钥。

1. 选择**下一步**。

   此过程的其余步骤与[创建标准 KMS 密钥](create-keys.md)的步骤相同。

1. 为 KMS 密钥键入别名（必需）和描述（可选）。

1. （可选）。在 **Add Tags**（添加标签）页面上，添加标识或分类 KMS 密钥的标签。

   向 AWS 资源添加标签时， AWS 会生成一份成本分配报告，其中包含按标签汇总的使用量和成本。标签还可以用来控制对 KMS 密钥的访问。有关轮换 KMS 密钥的信息，请参阅 [标签在 AWS KMS](tagging-keys.md) 和 [ABAC for AWS KMS](abac.md)。

1. 选择**下一步**。

1. 在 **Key Administrators**（密钥管理员）部分中，选择可管理 KMS 密钥的 IAM 用户和角色。有关更多信息，请参阅[允许密钥管理员管理 KMS 密钥](key-policy-default.md#key-policy-default-allow-administrators)。
**注意**  
IAM 策略可以向其他 IAM 用户和角色授予使用 KMS 密钥的权限。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。

1. （可选）要阻止这些密钥管理员删除此 KMS 密钥，请清除 **Allow key administrators to delete this key**（允许密钥管理员删除此密钥）复选框。

   删除 KMS 密钥是一种具有破坏性且不可撤销的操作，将导致加密文字不可恢复。即使您拥有外部密钥材料，也无法在外部密钥存储中重新创建对称 KMS 密钥。但是，删除 KMS 密钥会影响关联的外部密钥。有关从外部密钥存储中删除 KMS 密钥的信息，请参阅[删除密钥的特殊注意事项](deleting-keys.md#special-considerations-delete)。

1. 选择**下一步**。

1. **在此账户**部分中，选择可以在[加密操作](kms-cryptography.md#cryptographic-operations)中使用 KMS 密钥的 IAM 用户和角色。 AWS 账户 有关更多信息，请参阅[允许密钥用户使用 KMS 密钥](key-policy-default.md#key-policy-default-allow-users)。
**注意**  
IAM policy 可以向其他 IAM 用户和角色授予使用 KMS 密钥的权限。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。

1. （可选）您可以允许其他人使用 AWS 账户 此 KMS 密钥进行加密操作。为此，请在页面底部的 AWS 账户“**其他**” 部分中，选择 “**添加另一个**”， AWS 账户然后输入外部账户的 AWS 账户 ID。要添加多个外部账户，请重复此步骤。
**注意**  
另一方的管理员还 AWS 账户 必须通过为其用户创建 IAM 策略来允许访问 KMS 密钥。有关更多信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。

1. 选择**下一步**。

1. 检视您选择的密钥设置。您仍然可以返回并更改所有设置。

1. 完成后，选择 **Finish**（完成）以创建密钥。

**方法 2：在客户托管密钥中开始**

此过程与使用密钥材料创建对称加密密 AWS KMS 钥的过程相同。但是，在此过程中，您需要指定外部密钥存储的自定义密钥存储 ID 和外部密钥的密钥 ID。您还必须为外部密钥存储中的 KMS 密钥指定[必需的属性值](#xks-key-requirements)，例如密钥规格和密钥用法。

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/km](https://console.aws.amazon.com/kms) s 处打开 AWS Key Management Service (AWS KMS) 控制台。

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 在导航窗格中，选择**客户托管密钥**。

1. 选择**创建密钥**。

1. 选择 **Symmetric (对称)**。

1. 在 **Key usage**（密钥用法）中，已为您选择了 **Encrypt and decrypt**（加密和解密）选项。请勿对其进行更改。

1. 选择 **Advanced options (高级选项)**。

1. 对于 **Key material origin**（密钥材料源），选择 **External key store**（外部密钥存储）。

1. 请确认您打算在指定的外部密钥存储中创建 KMS 密钥。

1. 选择**下一步**。

1. 请选择代表新 KMS 密钥外部密钥存储的行。

   您无法选择已断开连接的外部密钥存储。若要连接已断开连接的密钥存储，请选择密钥存储名称，然后从 **Key store actions**（密钥存储操作）中选择 **Connect**（连接）。有关更多信息，请参阅 [使用控制 AWS KMS 台](about-xks-connecting.md#connect-xks-console)。

1. 在[外部密钥管理器](keystore-external.md#concept-ekm)中输入[外部密钥](keystore-external.md#concept-external-key)的密钥 ID。此外部密钥必须[满足与 KMS 密钥一起使用的要求](#xks-key-requirements)。创建 KMS 密钥后，您无法更改此值。

   如果外部密钥有多个 IDs，请输入外部密钥存储代理用来识别外部密钥的密钥 ID。

1. 选择**下一步**。

   此过程的其余步骤与[创建标准 KMS 密钥](create-keys.md)的步骤相同。

1. 为 KMS 密钥键入别名和可选的描述。

1. （可选）。在 **Add Tags**（添加标签）页面上，添加标识或分类 KMS 密钥的标签。

   向 AWS 资源添加标签时， AWS 会生成一份成本分配报告，其中包含按标签汇总的使用量和成本。标签还可以用来控制对 KMS 密钥的访问。有关轮换 KMS 密钥的信息，请参阅 [标签在 AWS KMS](tagging-keys.md) 和 [ABAC for AWS KMS](abac.md)。

1. 选择**下一步**。

1. 在 **Key Administrators**（密钥管理员）部分中，选择可管理 KMS 密钥的 IAM 用户和角色。有关更多信息，请参阅[允许密钥管理员管理 KMS 密钥](key-policy-default.md#key-policy-default-allow-administrators)。
**注意**  
IAM 策略可以向其他 IAM 用户和角色授予使用 KMS 密钥的权限。

1. （可选）要阻止这些密钥管理员删除此 KMS 密钥，请清除 **Allow key administrators to delete this key**（允许密钥管理员删除此密钥）复选框。

   删除 KMS 密钥是一种具有破坏性且不可撤销的操作，将导致加密文字不可恢复。即使您拥有外部密钥材料，也无法在外部密钥存储中重新创建对称 KMS 密钥。但是，删除 KMS 密钥会影响关联的外部密钥。有关从外部密钥存储中删除 KMS 密钥的信息，请参阅 [删除一个 AWS KMS key](deleting-keys.md)。

1. 选择**下一步**。

1. **在此账户**部分中，选择可以在[加密操作](kms-cryptography.md#cryptographic-operations)中使用 KMS 密钥的 IAM 用户和角色。 AWS 账户 有关更多信息，请参阅[允许密钥用户使用 KMS 密钥](key-policy-default.md#key-policy-default-allow-users)。
**注意**  
IAM policy 可以向其他 IAM 用户和角色授予使用 KMS 密钥的权限。

1. （可选）您可以允许其他人使用 AWS 账户 此 KMS 密钥进行加密操作。为此，请在页面底部的 AWS 账户“**其他**” 部分中，选择 “**添加另一个**”， AWS 账户然后输入外部账户的 AWS 账户 ID。要添加多个外部账户，请重复此步骤。
**注意**  
另一方的管理员还 AWS 账户 必须通过为其用户创建 IAM 策略来允许访问 KMS 密钥。有关更多信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。

1. 选择**下一步**。

1. 检视您选择的密钥设置。您仍然可以返回并更改所有设置。

1. 完成后，选择 **Finish**（完成）以创建密钥。

该过程成功后，显示内容将在您选择的外部密钥存储中显示新 KMS 密钥。选择新 KMS 密钥的名称或别名时，其详细信息页面上的 **Cryptographic configuration**（加密配置）选项卡会显示 KMS 密钥的源 [**External key store**（外部密钥存储）]，自定义密钥存储的名称、ID 和类型，以及外部密钥的 ID、密钥用法和状态。如果此过程失败，则会出现一条描述失败的错误消息。对于 ，请参阅 [排查外部密钥存储的问题](xks-troubleshooting.md)。

**提示**  
若要更轻松地识别自定义密钥存储中的 KMS 密钥，请在 **Customer managed keys**（客户托管密钥）页面上，将 **Origin**（源）和 **Custom key store ID**（自定义密钥存储 ID）列添加到显示中。若要更改表格字段，请选择页面右上角的齿轮图标。有关更多信息，请参阅 [自定义控制台视图](viewing-console-customize.md)。

### 使用 AWS KMS API
<a name="create-xks-key-api"></a>

要在外部密钥存储中创建新的 KMS 密钥，请使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作。以下参数为必需参数：
+ `Origin` 值必须为 `EXTERNAL_KEY_STORE`。
+ `CustomKeyStoreId` 参数标识您的外部密钥存储。指定外部密钥存储的 [`ConnectionState`](xks-connect-disconnect.md#xks-connection-state) 必须是 `CONNECTED`。若要找到 `CustomKeyStoreId` 和 `ConnectionState`，请使用 `DescribeCustomKeyStores` 操作。
+ `XksKeyId` 参数标识外部密钥。此外部密钥必须[满足与 KMS 密钥关联的要求](#xks-key-requirements)。

您也可以使用 `CreateKey` 操作的任何可选参数，例如使用 `Policy` 或 [Tags](https://docs.aws.amazon.com/kms/latest/APIReference/API_TagResource.html)（标签）参数。

**注意**  
不要在 `Description` 或 `Tags` 字段中包含机密或敏感信息。这些字段可能以纯文本形式出现在 CloudTrail 日志和其他输出中。

本部分中的示例使用 [AWS Command Line Interface (AWS CLI)](https://aws.amazon.com/cli/)，但您可以使用任何受支持的编程语言。

此示例命令使用该[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作在外部密钥存储中创建 KMS 密钥。响应包括 KMS 密钥的属性、外部密钥存储的 ID 以及外部密钥的 ID、用法和状态。

在运行此命令之前，请将示例自定义密钥存储 ID 替换为有效的 ID。

```
$ aws kms create-key --origin EXTERNAL_KEY_STORE --custom-key-store-id cks-1234567890abcdef0 --xks-key-id bb8562717f809024
{
  "KeyMetadata": {
    "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "AWSAccountId": "111122223333",
    "CreationDate": "2022-12-02T07:48:55-07:00",
    "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
    "CustomKeyStoreId": "cks-1234567890abcdef0",
    "Description": "",
    "Enabled": true,
    "EncryptionAlgorithms": [
      "SYMMETRIC_DEFAULT"
    ],
    "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
    "KeyManager": "CUSTOMER",
    "KeySpec": "SYMMETRIC_DEFAULT",
    "KeyState": "Enabled",
    "KeyUsage": "ENCRYPT_DECRYPT",
    "MultiRegion": false,
    "Origin": "EXTERNAL_KEY_STORE",
    "XksKeyConfiguration": {
      "Id": "bb8562717f809024"
    }
  }
}
```