

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

# 创建 KMS 密钥
<a name="create-keys"></a>

可以在 AWS KMS keys 中创建 AWS 管理控制台，也可以使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作或[AWS::KMS::Key AWS CloudFormation 资源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html)进行创建。在此过程中，您要设置 KMS 密钥的密钥政策，但您可以随时更改该政策。您还可以选择以下值来定义您创建的 KMS 密钥的类型。创建 KMS 密钥后，这些属性无法更改。

**KMS 密钥类型**  
*密钥类型*是一个决定创建什么类型的加密密钥的属性。 AWS KMS 提供了三种保护数据的关键类型：  
+ 高级加密标准（AES）对称密钥

  256 位密钥在 AES 的 Galois 计数器模式 (GCM) 模式下使用，用于对大小小于 4KB 的数据进行身份验证 encryption/decryption 。这是最常见的密钥类型，用于保护您的应用程序中使用的其他数据加密密钥，并通过 AWS 服务 这些密钥代表您加密您的数据。
+ RSA、椭圆曲线或（仅限 SM2 中国区域）非对称密钥

  这些密钥提供各种大小，并支持多种算法。根据算法选择，其可能用于加密和解密、签名和验证或派生共享密钥操作。
+ 用于执行 HMAC 散列消息认证码操作的对称密钥

  这些密钥是用于签名和验证操作的 256 位密钥。

  无法以明文形式从服务中导出 KMS 密钥。它们由服务使用的硬件安全模块 (HSMs) 生成，并且只能在其中使用。这是 AWS KMS 用于确保密钥不被泄露的基本安全属性。

** 密钥用法**  
*密钥用法*属性决定密钥支持的加密操作。KMS 密钥的密钥用法可以是 `ENCRYPT_DECRYPT`、`SIGN_VERIFY`、`GENERATE_VERIFY_MAC` 或 `KEY_AGREEMENT`。每个 KMS 密钥都只能有一个密钥用法。这遵循了[美国国家标准与技术研究院（NIST）特别出版物 800-57 号《密钥管理建议》](https://csrc.nist.gov/pubs/sp/800/57/pt1/r5/final)第 5.2 节“密钥用法”中有关密钥用法的最佳实践建议。将 KMS 密钥用于多种操作类型，会使两种操作的产物更容易受到攻击。

** 密钥规范**  
*密钥规范* 是一种属性，用于表示密钥的加密配置。密钥规范的含义因密钥类型而异。  
对于 KMS 密钥，*密钥规范*将确定 KMS 密钥是对称密钥还是非对称密钥。它还可确定其密钥材料类型，及其支持的算法。  
默认密钥规范 [SYMMETRIC\$1DEFAULT](symm-asymm-choose-key-spec.md#symmetric-cmks) 表示一组 256 位的对称加密密钥。有关所有支持的密钥规范的详细说明，请参阅 [密钥规范引用](symm-asymm-choose-key-spec.md)。

** 密钥材料源**  
*密钥材料源*是标识 KMS 密钥中密钥材料的来源的 KMS 密钥属性。您在创建 KMS 密钥时选择密钥材料源，并且无法更改。密钥材料的来源会影响 KMS 密钥的安全性、耐久性、可用性、延迟和吞吐量特性。  
每个 KMS 密钥的元数据中都包含对其密钥材料的引用。对称加密 KMS 密钥的密钥材料源可能会有所不同。您可以使用 AWS KMS 生成的密钥材料、在[自定义密钥存储](key-store-overview.md#custom-key-store-overview)中生成的密钥材料，或者[导入自己的密钥材料](importing-keys.md)。  
默认情况下，每个 KMS 密钥都具有唯一的密钥材料。但是，您可以使用相同的密钥材料创建一组[多区域密钥](multi-region-keys-overview.md)。  
KMS 密钥可以具有以下密钥材料来源值之一：`AWS_KMS`、`EXTERNAL`（[导入的密钥材料](importing-keys.md)）、`AWS_CLOUDHSM`（[密钥存储中的 KMS AWS CloudHSM 密钥](keystore-cloudhsm.md)）或`EXTERNAL_KEY_STORE`（[外部密钥存储中的 KMS 密钥](keystore-external.md)）。

**Topics**
+ [

## 创建 KMS 密钥的权限
](#create-key-permissions)
+ [

## 选择要创建的 KMS 密钥的类型
](#symm-asymm-choose)
+ [

# 创建对称加密 KMS 密钥
](create-symmetric-cmk.md)
+ [

# 创建非对称 KMS 密钥
](asymm-create-key.md)
+ [

# 创建 HMAC KMS 密钥
](hmac-create-key.md)
+ [

# 创建多区域主密钥
](create-primary-keys.md)
+ [

# 创建多区域副本密钥
](multi-region-keys-replicate.md)
+ [

# 删除具有导入密钥材料的 KMS 密钥
](importing-keys-conceptual.md)
+ [

# 在密钥库中创建 KMS AWS CloudHSM 密钥
](create-cmk-keystore.md)
+ [

# 在外部密钥存储中创建 KMS 密钥
](create-xks-keys.md)

## 创建 KMS 密钥的权限
<a name="create-key-permissions"></a>

要在控制台中或使用创建 KMS 密钥 APIs，您必须在 IAM 策略中拥有以下权限。在可能的情况下，使用[条件键](policy-conditions.md)来限制权限。例如，您可以在 IAM 策略中使用 kms[: KeySpec](conditions-kms.md#conditions-kms-key-spec) 条件密钥来允许委托人仅创建对称加密密钥。

有关创建密钥的委托人的 IAM policy 的示例，请参阅 [允许用户创建 KMS 密钥](customer-managed-policies.md#iam-policy-example-create-key)。

**注意**  
请谨慎授予委托人管理标签和别名的权限。更改标签或别名可以允许或拒绝对客户托管密钥的权限。有关更多信息，请参阅 [ABAC for AWS KMS](abac.md)。
+ [km CreateKey s:](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html) 为必填项。
+ [km CreateAlias s:](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html) 需要在控制台中创建 KMS 密钥，其中每个新的 KMS 密钥都需要一个别名。
+ [km TagResource s:](https://docs.aws.amazon.com/kms/latest/APIReference/API_TagResource.html) 需要在创建 KMS 密钥时添加标签。
+ CreateServiceLinkedRolei@@ [am:](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceLinkedRole.html) 是创建多区域主密钥所必需的。有关更多信息，请参阅 [控制对多区域密钥的访问](multi-region-keys-auth.md)。

创建 [KMS 密钥不需要 kms: PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html) 权限。`kms:CreateKey` 权限包括设置初始密钥策略的权限。但是，您必须在创建 KMS 密钥时将此权限添加到密钥策略中，以确保您可以控制对 KMS 密钥的访问。另一种方法是使用[BypassLockoutSafetyCheck](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html#KMS-CreateKey-request-BypassPolicyLockoutSafetyCheck)参数，但不建议这样做。

KMS 密钥属于创建密钥的 AWS 账户。创建 KMS 密钥的 IAM 用户不会被视为密钥的拥有者，且他们不会自动获得使用或管理自己所创建 KMS 密钥的权限。与任何其他主体一样，密钥创建者需要通过密钥策略、IAM policy 或授权获得权限。但是，拥有 `kms:CreateKey` 权限的主体可以设置初始密钥策略，并授予自己使用或管理密钥的权限。

## 选择要创建的 KMS 密钥的类型
<a name="symm-asymm-choose"></a>

创建的 KMS 密钥类型在很大程度上取决于计划*使用* KMS 密钥的方式，以及安全要求和授权要求。KMS 密钥的密钥类型和密钥用法决定了该密钥可以执行的加密操作。每个 KMS 密钥只有一个密钥用法。将 KMS 密钥用于多种操作类型，会使所有操作的产物更容易受到攻击。

要允许委托人仅针对特定的密钥使用创建 KMS 密钥，请使用 k [ms: KeyUsage](conditions-kms.md#conditions-kms-key-usage) 条件密钥。还可以使用 `kms:KeyUsage` 条件键，允许委托人根据 KMS 密钥的密钥用法对其调用 API 操作。例如，可以允许仅当 KMS 密钥的密钥用法为 SIGN\$1VERIFY 时禁用 KMS 密钥的权限。

请根据使用案例，遵照以下指南确定所需的 KMS 密钥类型。

**加密和解密数据**  
对于需要加密和解密数据的大多数使用案例，使用[对称 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)。 AWS KMS 使用的对称加密算法快速、高效，并可确保数据的机密性和真实性。它支持具有附加身份验证数据 (AAD) 的身份验证加密，这些数据定义为[加密上下文](encrypt_context.md)。这种类型的 KMS 密钥要求加密数据的发送者和接收者都具有有效的通话 AWS 凭证 AWS KMS。  
如果您的用例要求无法呼叫的用户在外部 AWS 进行加密 AWS KMS，那么[非对称 KMS 密钥](symmetric-asymmetric.md)是一个不错的选择。您可以分发非对称 KMS 密钥的公有密钥，以允许这些用户对数据进行加密。需要解密该数据的应用程序，可以在 AWS KMS内部使用非对称 KMS 密钥的私有密钥。

**签署消息并验证签名**  
要签署消息并验证签名，必须使用[非对称 KMS 密钥](symmetric-asymmetric.md)。您可以将 KMS 密钥与表示 RSA [密钥对、椭圆曲线 (ECC) 密钥对、ML-DSA 密钥对或密钥对的密钥规格](symm-asymm-choose-key-spec.md)一起使用（仅限中国区域）。 SM2 选择哪种密钥规范由想要使用的签名算法决定。推荐使用 ECC 密钥对支持的 ECDSA 签名算法，而不是 RSA 签名算法。从 RSA 或 ECC 密钥迁移到后量子密钥时，请使用 ML-DSA 密钥对。不过，您可能需要使用特定的密钥规范和签名算法来支持在 AWS之外验证签名的用户。

**使用非对称密钥对加密**  
要使用非对称密钥对加密数据，必须使用具有 [RSA 密钥规范或[密钥规范的非](symmetric-asymmetric.md)对称 KMS 密SM2 ](symm-asymm-choose-key-spec.md#key-spec-rsa-encryption)[钥（仅限](symm-asymm-choose-key-spec.md#key-spec-sm)中国区域）。要使用 KMS 密钥对的公有密钥为 AWS KMS 中的数据进行加密，请使用 [Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) 操作。您也可以[下载公钥](download-public-key.md)并与需要在外部加密数据的各方共享 AWS KMS。  
下载非对称 KMS 密钥的公有密钥后，可以在 AWS KMS外部使用该密钥。但它不再受保护 KMS 密钥的安全控制措施的约束 AWS KMS。例如，您不能使用 AWS KMS 密钥策略或授权来控制公钥的使用。您也无法控制密钥是否仅用于使用支持的加密算法进行加密和解密。 AWS KMS 有关更多详细信息，请参阅[下载公有密钥的特殊注意事项](offline-public-key.md#download-public-key-considerations)。  
要解密使用外部公钥加密的数据，请调用 [Dec](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) rypt 操作。 AWS KMS如果使用 `SIGN_VERIFY` 的密钥用法通过 KMS 密钥中的公有密钥对数据进行加密，则 `Decrypt` 操作会失败。如果使用 AWS KMS 不支持您选择的密钥规范的算法对其进行加密，它也会失败。有关密钥规范和支持算法的更多信息，请参阅 [密钥规范引用](symm-asymm-choose-key-spec.md)。  
为避免这些错误，任何在之外使用公钥的人 AWS KMS 都必须存储密钥配置。 AWS KMS 控制台和[GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)响应提供了共享公钥时必须包含的信息。

**派生共享密钥**  
要派生共享密钥，请使用带有 [NIST 标准椭圆曲线的 KMS 密钥或](symm-asymm-choose-key-spec.md#key-spec-ecc)（仅限[SM2](symm-asymm-choose-key-spec.md#key-spec-sm)中国区域）密钥材料。 AWS KMS 使用[椭圆曲线密码学辅助因子 Diffie-Hellman Priman Primitive (ECDH) 通过从两个对等体的椭圆曲线公私钥对中得出共享](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar3.pdf#page=60)密钥来建立密钥协议。您可以使用[ DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html)操作返回的原始共享密钥来派生对称密钥，该密钥可以加密和解密在双方之间发送的数据，或者生成和验证。 HMACs AWS KMS 建议您在使用原始共享[密钥派生对称密钥时，遵循 NIST 关于](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Cr2.pdf)密钥派生的建议。

**生成并验证 HMAC 代码**  
要生成和验证散列消息认证码，请使用 HMAC 密钥。在中创建 HMAC 密钥时 AWS KMS， AWS KMS 会创建和保护您的密钥材料，并确保对密钥使用正确的 MAC 算法。HMAC 代码也可以用作伪随机数，在某些情况下用于对称签名和令牌化。  
HMAC KMS 密钥是对称密钥。在 AWS KMS 控制台中创建 HMAC KMS 密钥时，选择 `Symmetric` 密钥类型。

**与 AWS 服务一起使用**  <a name="cmks-aws-service"></a>
要创建 KMS 密钥以与[集成的AWS 服务一起](service-integration.md)使用 AWS KMS，请查阅该服务的文档。 AWS 加密数据的服务需要对[称加密 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)。

除上述注意事项外，KMS 密钥加密操作的密钥规范不同，其价格和请求限额也不同。有关 AWS KMS 定价的信息，请参阅 [AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing/)。有关请求配额的信息，请参阅 [请求配额](requests-per-second.md)。

# 创建对称加密 KMS 密钥
<a name="create-symmetric-cmk"></a>

本主题介绍如何创建基本 KMS 密钥，这是针对单个区域的[对称加密 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)，密钥材料来自 AWS KMS于。您可以在 AWS 服务中使用此 KMS 密钥保护您的资源。

您可以在 AWS KMS 控制台、使用 [CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)API 或使用[AWS::KMS::Key CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html)创建对称加密 KMS 密钥。

默认密钥规范 [SYMMETRIC\$1DEFAULT](symm-asymm-choose-key-spec.md#symmetric-cmks) 是对称加密 KMS 密钥的密钥规范。当您在 AWS KMS 控制台中选择 **Symmetric** 密钥类型**以及加密和解密密**钥用法时，它会选择密钥规范。`SYMMETRIC_DEFAULT`在[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作中，如果您未指定`KeySpec`值，则会选择 SYMMETRIC\$1DEFAULT。如果您没有理由使用其他密钥规范，SymMETIC\$1DEFAULT 是个不错的选择。

有关应用于 KMS 密钥的配额的信息，请参阅 [配额](limits.md)。

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

您可以使用创建 AWS KMS keys （KMS 密钥）。 AWS 管理控制台 

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

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. 要创建对称加密 KMS 密钥，请为 **Key type**（密钥类型）选择 **Symmetric**（对称）。

1. 在**密钥用法**中，系统已为您选择**加密和解密**选项。

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

1. 键入 KMS 密钥的别名。别名名称不能以 **aws/** 开头。该**aws/**前缀由 Amazon Web Services 保留，用于 AWS 托管式密钥 在您的账户中表示。
**注意**  
添加、删除或更新别名可以允许或拒绝对 KMS 密钥的权限。有关详细信息，请参阅 [ABAC for AWS KMS](abac.md) 和 [使用别名控制对 KMS 密钥的访问](alias-authorization.md)。

    别名是一个显示名称，您可以使用它来标识 KMS 密钥。我们建议您选择一个别名，用来指示您计划保护的数据类型或计划与 KMS 密钥搭配使用的应用程序。

    

    在 AWS 管理控制台中创建 KMS 密钥时需要别名。当您使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作时，它们是可选的。

1. （可选）为 KMS 密钥键入描述。

   现在，除非[密钥状态](key-state.md)为 `Pending Deletion` 或 `Pending Replica Deletion`，否则您可以随时添加描述或更新描述。要添加、更改或删除现有客户托管密钥的描述，请在 AWS 管理控制台 或使用[UpdateKeyDescription](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateKeyDescription.html)操作中编辑 KMS 密钥的详细信息页面上的描述。

1. （可选）键入标签键和一个可选标签值。要向 KMS 密钥添加多个标签，请选择 **Add tag**（添加标签）。
**注意**  
标记或取消标记 KMS 密钥可以允许或拒绝对 KMS 密钥的权限。有关详细信息，请参阅 [ABAC for AWS KMS](abac.md) 和 [使用标签控制对 KMS 密钥的访问](tag-authorization.md)。

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

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

1. 选择可管理 KMS 密钥的 IAM 用户和角色。
**注意**  
此密钥策略赋予了对此 KMS 密钥的 AWS 账户 完全控制权。此控制权允许账户管理员使用 IAM policy 授予其他主体管理 KMS 密钥的权限。有关更多信息，请参阅 [默认密钥策略](key-policy-default.md)。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。  
 AWS KMS 控制台在语句标识符下将密钥管理员添加到密钥策略中`"Allow access for Key Administrators"`。如果修改此语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）要阻止选定 IAM 用户和角色删除此 KMS 密钥，请在页面底部的**密钥删除**部分中，清除**允许密钥管理员删除此密钥**复选框。

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

1. 选择可在[加密操作](kms-cryptography.md#cryptographic-operations)中使用密钥的 IAM 用户和角色
**注意**  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。  
 AWS KMS 控制台在语句标识符`"Allow use of the key"`和下将密钥用户添加到密钥策略中`"Allow attachment of persistent resources"`。如果修改这些语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

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

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

1. 检查密钥的密钥策略语句。要对密钥策略进行更改，请选择**编辑**。

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

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

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

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

您可以使用该[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作来创建 AWS KMS keys 所有类型。这些示例使用 [AWS Command Line Interface （AWS CLI）](https://aws.amazon.com/cli/)。有关使用多种编程语言的示例，请参阅[`CreateKey`与 AWS SDK 或 CLI 配合使用](example_kms_CreateKey_section.md)。

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

以下操作会在由 AWS KMS生成的密钥材料提供支持的单个区域中创建对称加密密钥。该操作没有必需参数。不过，您可能还希望使用 `Policy` 参数指定密钥策略。您可以随时更改密钥策略 ([PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html)) 并添加可选元素，例如[描述](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)和[标签](https://docs.aws.amazon.com/kms/latest/APIReference/API_TagResource.html)。您还可以创建[非对称密钥](asymm-create-key.md#create-asymmetric-keys-api)、[多区域密钥](create-primary-keys.md)、具有[导入密钥材料](importing-keys-create-cmk.md#importing-keys-create-cmk-api)的密钥以及[自定义密钥存储](create-cmk-keystore.md#create-cmk-keystore-api)中的密钥。要创建用于客户端加密的数据密钥，请使用[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)操作。

该`CreateKey`操作不允许您指定别名，但您可以使用该[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)操作为新 KMS 密钥创建别名。

以下示例显示的是在没有任何参数的情况下调用 `CreateKey` 操作。此命令使用所有默认值。它将创建一个具有 AWS KMS生成的密钥材料的对称加密 KMS 密钥。

```
$ aws kms create-key
{
    "KeyMetadata": {
        "Origin": "AWS_KMS",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "Description": "",
        "KeyManager": "CUSTOMER",
        "Enabled": true,
        "KeySpec": "SYMMETRIC_DEFAULT",
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1502910355.475,
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
        "AWSAccountId": "111122223333",
        "MultiRegion": false
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ],
    }
}
```

如果您不为新 KMS 密钥指定密钥策略，则 `CreateKey` 应用的[默认密钥策略](key-policy-default.md)会不同于在您使用控制台创建新 KMS 密钥时控制台应用的默认密钥策略。

例如，对[GetKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetKeyPolicy.html)操作的此调用将返回`CreateKey`适用的密钥策略。它授予对 KMS 密钥的 AWS 账户 访问权限，并允许其为 KMS 密钥创建 AWS Identity and Access Management (IAM) 策略。有关 KMS 密钥的 IAM policy 和密钥策略的详细信息，请参阅 [KMS 密钥访问权限和权限](control-access.md)

```
$ aws kms get-key-policy --key-id 1234abcd-12ab-34cd-56ef-1234567890ab --policy-name default --output text
```

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id" : "key-default-1",
  "Statement" : [ {
    "Sid" : "EnableIAMUserPermissions",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::111122223333:root"
    },
    "Action" : "kms:*",
    "Resource" : "*"
  } ]
}
```

------

# 创建非对称 KMS 密钥
<a name="asymm-create-key"></a>

您可以在 AWS KMS 控制台、使用 [CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)API 或使用[AWS::KMS::Key CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html)创建[非对称 KMS 密钥](symmetric-asymmetric.md)。非对称 KMS 密钥表示可用于加密、签名或派生共享密钥的公有密钥和私有密钥对。私钥保留在里面 AWS KMS。要下载公钥以供外部使用 AWS KMS，请参阅[下载公有密钥](download-public-key.md)。

创建非对称 KMS 密钥时，必须选择密钥规范。通常，选择哪个密钥规范取决于法规、安全或业务要求。也可能受需要加密或签名的消息大小的影响。一般来说，加密密钥越长，对暴力攻击的抵抗力越强。有关所有支持的密钥规范的详细说明，请参阅[密钥规范引用](symm-asymm-choose-key-spec.md)。

AWS 与集成的服务 AWS KMS 不支持非对称 KMS 密钥。如果要创建 KMS 密钥来加密您在 AWS 服务中存储或管理的数据，请[创建对称加密 KMS 密钥](create-symmetric-cmk.md)。

有关创建 KMS 密钥所需权限的信息，请参阅 [创建 KMS 密钥的权限](create-keys.md#create-key-permissions)。

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

您可以使用创建非对称 AWS KMS keys （KMS 密钥）。 AWS 管理控制台 每个非对称 KMS 密钥表示一个公有密钥和私有密钥对。

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

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. 要创建非对称 KMS 密钥，请在 **Key type**（密钥类型）中选择 **Asymmetric**（非对称）。

1. 要创建用于公有密钥加密的非对称 KMS 密钥，请在 **Key usage**（密钥用法）中选择 **Encrypt and decrypt**（加密和解密）。

   要创建用于签署消息和验证签名的非对称 KMS 密钥，请在**密钥用法**中选择**签名和验证**。

   要创建用于派生共享密钥的非对称 KMS 密钥，请在**密钥用法**中，选择**密钥协议**。

   有关选择密钥用法值的帮助信息，请参阅[选择要创建的 KMS 密钥的类型](create-keys.md#symm-asymm-choose)。

1. 为非对称 KMS 密钥选择规范（**密钥规范**）。

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

1. 为 KMS 密钥键入[别名](kms-alias.md)。别名名称不能以 **aws/** 开头。**aws/** 前缀由 Amazon Web Services 预留，用于在您的账户中表示 AWS 托管式密钥 。

   *别名*是一个友好的名称，可用于在控制台和某些控制台中识别 KMS 密钥 AWS KMS APIs。我们建议您选择一个别名，用来指示您计划保护的数据类型或计划与 KMS 密钥搭配使用的应用程序。

   在 AWS 管理控制台中创建 KMS 密钥时需要别名。使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作时无法指定别名，但可以使用控制台或[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)操作为现有 KMS 密钥创建别名。有关更多信息，请参阅 [中的别名 AWS KMS](kms-alias.md)。

1. （可选）为 KMS 密钥键入描述。

   输入一个描述，用来说明您计划保护的数据类型或计划与 KMS 密钥配合使用的应用程序。

   现在，除非[密钥状态](key-state.md)为 `Pending Deletion` 或 `Pending Replica Deletion`，否则您可以随时添加描述或更新描述。要添加、更改或删除现有客户托管密钥的描述，请在 AWS 管理控制台 或使用[UpdateKeyDescription](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateKeyDescription.html)操作中编辑 KMS 密钥的详细信息页面上的描述。

1. （可选）键入标签键和一个可选标签值。要向 KMS 密钥添加多个标签，请选择 **Add tag**（添加标签）。

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

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

1. 选择可管理 KMS 密钥的 IAM 用户和角色。
**注意**  
此密钥策略赋予了对此 KMS 密钥的 AWS 账户 完全控制权。此控制权允许账户管理员使用 IAM policy 授予其他主体管理 KMS 密钥的权限。有关更多信息，请参阅 [默认密钥策略](key-policy-default.md)。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。  
 AWS KMS 控制台在语句标识符下将密钥管理员添加到密钥策略中`"Allow access for Key Administrators"`。如果修改此语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）要阻止选定 IAM 用户和角色删除此 KMS 密钥，请在页面底部的**密钥删除**部分中，清除**允许密钥管理员删除此密钥**复选框。

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

1. 选择可将 KMS 密钥用于[加密操作](kms-cryptography.md#cryptographic-operations)的 IAM 用户和角色。
**注意**  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。  
 AWS KMS 控制台在语句标识符`"Allow use of the key"`和下将密钥用户添加到密钥策略中`"Allow attachment of persistent resources"`。如果修改这些语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）您可以允许其他人使用 AWS 账户 此 KMS 密钥进行加密操作。为此，请在页面底部的**其他 AWS 账户**部分中选择**添加其他 AWS 账户**，然后输入外部账户的 AWS 账户 标识号。要添加多个外部账户，请重复此步骤。
**注意**  
若要允许外部账户中的主体使用 KMS 密钥，外部账户的管理员必须创建提供这些权限的 IAM policy。有关更多信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。

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

1. 检查密钥的密钥策略语句。要对密钥策略进行更改，请选择**编辑**。

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

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

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

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

您可以使用该[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作来创建非对称 AWS KMS key的。这些示例使用 [AWS Command Line Interface (AWS CLI)](https://aws.amazon.com/cli/)，但您可以使用任何受支持的编程语言。

创建非对称 KMS 密钥时，必须指定 `KeySpec` 参数，该参数决定了所创建的密钥类型。此外，还必须指定 `KeyUsage` 值是 ENCRYPT\$1DECRYPT、SIGN\$1VERIFY 还是 KEY\$1AGREEMENT。创建 KMS 密钥后，这些属性无法更改。

该`CreateKey`操作不允许您指定别名，但您可以使用该[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)操作为新 KMS 密钥创建别名。

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

**创建非对称 KMS 密钥对用于公共加密**  
以下示例使用 `CreateKey` 操作，创建一个 4096 位 RSA 密钥的非对称 KMS 密钥，用于公有密钥加密。

```
$ aws kms create-key --key-spec RSA_4096 --key-usage ENCRYPT_DECRYPT
{
    "KeyMetadata": {
        "KeyState": "Enabled",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "KeyManager": "CUSTOMER",
        "Description": "",
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
        "CreationDate": 1569973196.214,
        "MultiRegion": false,
        "KeySpec": "RSA_4096",
        "CustomerMasterKeySpec": "RSA_4096",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "EncryptionAlgorithms": [
            "RSAES_OAEP_SHA_1",
            "RSAES_OAEP_SHA_256"
        ],
        "AWSAccountId": "111122223333",
        "Origin": "AWS_KMS",
        "Enabled": true
    }
}
```

**创建非对称 KMS 密钥对用于签名和验证**  
以下示例命令创建一个非对称 KMS 密钥，表示一对用于签名和验证的 ECC 密钥。不能创建用于加密和解密的椭圆曲线密钥对。

```
$ aws kms create-key --key-spec ECC_NIST_P521 --key-usage SIGN_VERIFY
{
    "KeyMetadata": {
        "KeyState": "Enabled",
        "KeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
        "CreationDate": 1570824817.837,
        "Origin": "AWS_KMS",
        "SigningAlgorithms": [
            "ECDSA_SHA_512"
        ],
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321",
        "AWSAccountId": "111122223333",
        "KeySpec": "ECC_NIST_P521",
        "CustomerMasterKeySpec": "ECC_NIST_P521",
        "KeyManager": "CUSTOMER",
        "Description": "",
        "Enabled": true,
        "MultiRegion": false,
        "KeyUsage": "SIGN_VERIFY"
    }
}
```

**创建非对称 KMS 密钥对，用于派生共享密钥**  
以下示例命令创建一个非对称 KMS 密钥，表示一对用于派生共享密钥的 ECDH 密钥。不能创建用于加密和解密的椭圆曲线密钥对。

```
$ aws kms create-key --key-spec ECC_NIST_P256 --key-usage KEY_AGREEMENT
{
    "KeyMetadata": {
        "AWSAccountId": "111122223333",
        "KeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321",
        "CreationDate": "2023-12-27T19:10:15.063000+00:00",
        "Enabled": true,
        "Description": "",
        "KeyUsage": "KEY_AGREEMENT",
        "KeyState": "Enabled",
        "Origin": "AWS_KMS",
        "KeyManager": "CUSTOMER",
        "CustomerMasterKeySpec": "ECC_NIST_P256",
        "KeySpec": "ECC_NIST_P256",
        "KeyAgreementAlgorithms": [
            "ECDH"
        ],
        "MultiRegion": false
    }
}
```

# 创建 HMAC KMS 密钥
<a name="hmac-create-key"></a>

您可以在 AWS KMS 控制台、使用 [https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)API 或使用[AWS::KMS::Key CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html)创建 HMAC KMS 密钥。

创建 HMAC KMS 密钥时，必须选择密钥规范。 AWS KMS 支持 [HMAC KMS 密钥的多种密钥规格](symm-asymm-choose-key-spec.md#hmac-key-specs)。您选择的密钥规范可能取决于法规、安全或业务要求。一般来说，密钥越长，对暴力攻击的抵抗力越强。

有关创建 KMS 密钥所需权限的信息，请参阅 [创建 KMS 密钥的权限](create-keys.md#create-key-permissions)。

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

您可以使用创建 HMAC KMS 密钥。 AWS 管理控制台 HMAC KMS 密钥是对称密钥，其密钥用法为**Generate and verify MAC**（生成并验证 MAC）。您也可以创建多区域 HMAC 密钥。

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. 对于**密钥类型**，选择**对称**。

   HMAC KMS 密钥是对称密钥。您可以使用相同的密钥生成和验证 HMAC 标签。

1. 对于 **Key usage**（密钥用法），请选择 **Generate and verify MAC**（生成并验证 MAC）。

   生成并验证 MAC 是 HMAC KMS 密钥的唯一有效密钥用法。
**注意**  
**Key usage**（密钥用法）仅在所选区域支持 HMAC KMS 密钥时才会显示对称密钥。

1. 为 HMAC KMS 密钥选择规范（**密钥规范**）。

   您选择的密钥规范可取决于法规、安全或业务要求。一般来说，较长的密钥更安全。

1. 要创建[多区域](multi-region-keys-overview.md) *主* HMAC 密钥，在 **Advanced options**（高级选项）下，选择 **Multi-Region key**（多区域密钥）。您为此 KMS 密钥定义的[共享属性](multi-region-keys-overview.md#mrk-sync-properties)（例如密钥类型和密钥用法）将与其副本密钥共享。

   您无法使用该过程创建副本密钥。要创建多区域*副本* HMAC 密钥，请按照[创建副本密钥的说明](multi-region-keys-replicate.md)。

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

1. 为 KMS 密钥键入[别名](kms-alias.md)。别名名称不能以 **aws/** 开头。**aws/** 前缀由 Amazon Web Services 预留，用于在您的账户中表示 AWS 托管式密钥 。

   我们建议您使用将 KMS 密钥标识为 HMAC 密钥的别名，例如 `HMAC/test-key`。这将使您更轻松地在控制台中识别 HMAC 密钥，您可以在 AWS KMS 控制台中按标签和别名对密钥进行排序和筛选，但不能按密钥规格或密钥使用情况对密钥进行排序和筛选。

   在 AWS 管理控制台中创建 KMS 密钥时需要别名。使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作时无法指定别名，但可以使用控制台或[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)操作为现有 KMS 密钥创建别名。有关更多信息，请参阅 [中的别名 AWS KMS](kms-alias.md)。

1. （可选）为 KMS 密钥输入描述。

   输入一个描述，用来说明您计划保护的数据类型或计划与 KMS 密钥配合使用的应用程序。

   现在，除非[密钥状态](key-state.md)为 `Pending Deletion` 或 `Pending Replica Deletion`，否则您可以随时添加描述或更新描述。要添加、更改或删除现有客户托管密钥的描述，请在 AWS 管理控制台 或使用[UpdateKeyDescription](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateKeyDescription.html)操作中编辑 KMS 密钥的 AWS 管理控制台 详细信息页面上的描述。

1. （可选）输入标签键和一个可选标签值。要向 KMS 密钥添加多个标签，请选择 **Add tag**（添加标签）。

   考虑添加将密钥识别为 HMAC 密钥的标签，例如 `Type=HMAC`。这将使您更轻松地在控制台中识别 HMAC 密钥，您可以在 AWS KMS 控制台中按标签和别名对密钥进行排序和筛选，但不能按密钥规格或密钥使用情况对密钥进行排序和筛选。

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

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

1. 选择可管理 KMS 密钥的 IAM 用户和角色。
**注意**  
此密钥策略赋予了对此 KMS 密钥的 AWS 账户 完全控制权。此控制权允许账户管理员使用 IAM policy 授予其他主体管理 KMS 密钥的权限。有关更多信息，请参阅 [默认密钥策略](key-policy-default.md)。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。  
 AWS KMS 控制台在语句标识符下将密钥管理员添加到密钥策略中`"Allow access for Key Administrators"`。如果修改此语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）要阻止选定 IAM 用户和角色删除此 KMS 密钥，请在页面底部的**密钥删除**部分中，清除**允许密钥管理员删除此密钥**复选框。

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

1. 选择可将 KMS 密钥用于[加密操作](kms-cryptography.md#cryptographic-operations)的 IAM 用户和角色。
**注意**  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。  
 AWS KMS 控制台在语句标识符`"Allow use of the key"`和下将密钥用户添加到密钥策略中`"Allow attachment of persistent resources"`。如果修改这些语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）您可以允许其他人使用 AWS 账户 此 KMS 密钥进行加密操作。为此，请在页面底部的**其他 AWS 账户**部分中选择**添加其他 AWS 账户**，然后输入外部账户的 AWS 账户 标识号。要添加多个外部账户，请重复此步骤。
**注意**  
要允许外部账户中的委托人使用 KMS 密钥，外部账户的管理员必须创建提供这些权限的 IAM policy。有关更多信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。

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

1. 检查密钥的密钥策略语句。要对密钥策略进行更改，请选择**编辑**。

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

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

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

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

您可以使用该[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作创建 HMAC KMS 密钥。这些示例使用 [AWS Command Line Interface (AWS CLI)](https://aws.amazon.com/cli/)，但您可以使用任何受支持的编程语言。

创建 HMAC KMS 密钥时，必须指定 `KeySpec` 参数，该参数决定了 KMS 密钥的类型。另外，您必须指定 GENERATE\$1VERIFY\$1MAC 的 `KeyUsage` 值，尽管它是 HMAC 密钥的唯一有效密钥用法值。要创建[多区域](multi-region-keys-overview.md) HMAC KMS 密钥，添加值为 `true` 的 `MultiRegion` 参数。创建 KMS 密钥后，这些属性无法更改。

该`CreateKey`操作不允许您指定别名，但您可以使用该[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)操作为新 KMS 密钥创建别名。我们建议您使用将 KMS 密钥标识为 HMAC 密钥的别名，例如 `HMAC/test-key`。这将使您更轻松地在控制台中识别 HMAC 密钥，在 AWS KMS 控制台中，您可以按别名对密钥进行排序和筛选，但不能按密钥规格或密钥使用情况对密钥进行排序和筛选。

如果您尝试在不支持 HMAC 密钥的情况下创建 HMAC KMS 密钥，则该`CreateKey`操作会返回 AWS 区域 `UnsupportedOperationException`

以下示例使用 `CreateKey` 操作来创建 512 位的 HMAC KMS 密钥。

```
$ aws kms create-key --key-spec HMAC_512 --key-usage GENERATE_VERIFY_MAC
{
    "KeyMetadata": {
        "KeyState": "Enabled",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "KeyManager": "CUSTOMER",
        "Description": "",
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
        "CreationDate": 1669973196.214,
        "MultiRegion": false,
        "KeySpec": "HMAC_512",
        "CustomerMasterKeySpec": "HMAC_512",
        "KeyUsage": "GENERATE_VERIFY_MAC",
        "MacAlgorithms": [
            "HMAC_SHA_512"
        ],
        "AWSAccountId": "111122223333",
        "Origin": "AWS_KMS",
        "Enabled": true
    }
}
```

# 创建多区域主密钥
<a name="create-primary-keys"></a>

您可以在 AWS KMS 控制台中或使用 AWS KMS API 创建[多区域主密钥](multi-region-keys-overview.md#mrk-primary-key)。您可以在任何 AWS KMS 支持多区域密钥 AWS 区域 的地方创建主密钥。

要创建多区域主密钥，委托人需要与创建任何 KMS 密钥[相同的权限](create-keys.md#create-key-permissions)，包括 IAM 策略中的 k [ms: CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html) 权限。委托人还需要 ia [m: CreateServiceLinkedRole 权限](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceLinkedRole.html)。您可以使用 k [ms: MultiRegionKeyType](conditions-kms.md#conditions-kms-multiregion-key-type) 条件密钥来允许或拒绝创建多区域主密钥的权限。

**注意**  
创建多区域主密钥时，请谨慎考虑您选择用于管理和使用密钥的 IAM 用户和角色。IAM policy 可以向其他 IAM 用户和角色授予管理 KMS 密钥的权限。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。

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

要在 AWS KMS 控制台中创建多区域主密钥，请使用与创建任何 KMS 密钥相同的过程。您可以在**高级选项**中选择多区域密钥。有关完整说明，请参阅[创建 KMS 密钥](create-keys.md)。

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

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-asymmetric.md)密钥类型。对称密钥为原定设置。

   您可以创建多区域对称密钥和非对称密钥，包括对称的多区域 HMAC KMS 密钥。

1. 选择您的密钥使用方法。**Encrypt and decrypt**（加密和解密）是原定设置。

   有关帮助信息，请参阅 [创建 KMS 密钥](create-keys.md)、[创建非对称 KMS 密钥](asymm-create-key.md) 或 [创建 HMAC KMS 密钥](hmac-create-key.md)。

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

1. 在**密钥材料来源**下，要 AWS KMS 生成您的主密钥和副本密钥将共享的密钥材料，请选择 **KMS**。如果您 [将密钥材料导入](importing-keys-create-cmk.md) 到主密钥和副本密钥中，请选择 **External (Import key material)** [外部（导入密钥材料）]。

1. 在**区域性**下，选择**多区域密钥**。

   创建 KMS 密钥之后，您无法再更改此设置。

1. 为主密钥键入[别名](kms-alias.md)。

   别名不是多区域密钥的共享属性。您可以为多区域主密钥及其副本指定相同的别名或不同的别名。 AWS KMS 不会同步多区域密钥的别名。
**注意**  
添加、删除或更新别名可以允许或拒绝对 KMS 密钥的权限。有关详细信息，请参阅 [ABAC for AWS KMS](abac.md) 和 [使用别名控制对 KMS 密钥的访问](alias-authorization.md)。

1. （可选）键入主密钥的描述。

   描述不是多区域密钥的共享属性。您可以为多区域主密钥及其副本提供相同的描述或不同的描述。 AWS KMS 不同步多区域密钥的密钥描述。

1. （可选）键入标签键和一个可选标签值。要向主密钥分配多个标签，请选择 **Add tag**（添加标签）。

   标签不是多区域密钥的共享属性。您可以为多区域主密钥及其副本密钥指定相同的标签或不同的标签。 AWS KMS 不同步多区域密钥的标签。您可以随时更改 KMS 密钥上的标签。
**注意**  
标记或取消标记 KMS 密钥可以允许或拒绝对 KMS 密钥的权限。有关详细信息，请参阅 [ABAC for AWS KMS](abac.md) 和 [使用标签控制对 KMS 密钥的访问](tag-authorization.md)。

1. 选择可管理主密钥的 IAM 用户和角色。
**注意**  
此步骤将开始为主密钥创建[密钥策略](key-policies.md)的过程。密钥策略不是多区域密钥的共享属性。您可以为多区域主密钥及其副本提供相同的密钥策略或不同的密钥策略。 AWS KMS 不会同步多区域密钥的密钥策略。条件密钥值必须遵守密钥策略和 IAM policy 的字符和编码规则。
创建多区域主密钥时，可考虑使用控制台生成的[默认密钥策略](key-policy-default.md)。如果您修改此策略，则控制台将不会在创建副本密钥时提供选择密钥管理员和用户的步骤，也不会添加相应的策略语句。这样，您将需要手动添加这些语句。
 AWS KMS 控制台在语句标识符下将密钥管理员添加到密钥策略中`"Allow access for Key Administrators"`。如果修改此语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）要阻止选定 IAM 用户和角色删除此 KMS 密钥，请在页面底部的**密钥删除**部分中，清除**允许密钥管理员删除此密钥**复选框。

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

1. 选择可将 KMS 密钥用于[加密操作](kms-cryptography.md#cryptographic-operations)的 IAM 用户和角色。
**注意**  
 AWS KMS 控制台在语句标识符`"Allow use of the key"`和下将密钥用户添加到密钥策略中`"Allow attachment of persistent resources"`。如果修改这些语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）您可以允许其他人使用 AWS 账户 此 KMS 密钥进行加密操作。为此，请在页面底部的**其他 AWS 账户**部分中选择**添加其他 AWS 账户**，然后输入外部账户的 AWS 账户 标识号。要添加多个外部账户，请重复此步骤。
**注意**  
要允许外部账户中的委托人使用 KMS 密钥，外部账户的管理员必须创建提供这些权限的 IAM policy。有关更多信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。

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

1. 检查密钥的密钥策略语句。要对密钥策略进行更改，请选择**编辑**。

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

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

1. 选择**完成**以创建多区域主密钥。

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

要创建多区域主键，请使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作。使用带 `True` 值的 `MultiRegion` 参数。

例如，以下命令在调用者的主键 AWS 区域 (us-east-1) 中创建多区域主键。它接受所有其他属性的默认值，包括密钥策略。多区域主密钥的默认值与所有其他 KMS 密钥的默认值相同，包括[默认密钥策略](key-policy-default.md)。此过程将创建一个对称加密密钥，即默认 KMS 密钥。

响应包含 `MultiRegion` 元素和 `MultiRegionConfiguration` 元素，其中包含典型的子元素和不含副本密钥的多区域主密钥的值。多区域密钥的[密钥 ID](concepts.md#key-id-key-id) 总是以 `mrk-` 开头。

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

```
$ aws kms create-key --multi-region
{
    "KeyMetadata": {
        "Origin": "AWS_KMS",
        "KeyId": "mrk-1234abcd12ab34cd56ef1234567890ab",
        "Description": "",
        "KeyManager": "CUSTOMER",
        "Enabled": true,
        "KeySpec": "SYMMETRIC_DEFAULT",
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1606329032.475,
        "Arn": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
        "AWSAccountId": "111122223333",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ],
        "MultiRegion": true,
        "MultiRegionConfiguration": { 
            "MultiRegionKeyType": "PRIMARY",
            "PrimaryKey": { 
                "Arn": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
                "Region": "us-east-1"
            },
            "ReplicaKeys": [ ]
      }
    }
}
```

# 创建多区域副本密钥
<a name="multi-region-keys-replicate"></a>

您可以在 AWS KMS 控制台、使用[ReplicateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReplicateKey.html)操作或使用[AWS::KMS::ReplicaKey CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html)创建[多区域副本密钥](multi-region-keys-overview.md#mrk-primary-key)。您不能使用该[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作来创建副本密钥。

您可以使用这些步骤复制任何多区域主密钥，包括[对称加密 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)，[非对称 KMS 密钥](symmetric-asymmetric.md)，或者 [HMAC KMS 密钥](hmac.md)。

此操作完成后，新的副本密钥具有暂时性的[密钥状态](key-state.md) `Creating`。在创建新副本密钥的过程完成几秒后，此密钥状态将变为 `Enabled`（如果您使用[导入的密钥材料](importing-keys.md)创建多区域密钥，则变为 `PendingImport`）。当密钥状态为 `Creating` 时，您可以管理该密钥，但不能将其用于加密操作。如果您以编程方式创建和使用副本密钥，请在使用副本密钥之前重试`KMSInvalidStateException`或调[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)用检查其`KeyState`值。

如果误删了副本密钥，您可以使用此过程来重新创建副本密钥。如果您在同一区域中复制相同的主密钥，则您创建的新副本密钥将具有与原始副本密钥相同的[共享属性](multi-region-keys-overview.md#mrk-sync-properties)。

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

要使用 AWS CloudFormation 模板创建副本密钥，请参阅*AWS CloudFormation 用户指南[AWS::KMS::ReplicaKey](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html)*中的。

## 步骤 1：选择副本区域
<a name="replica-region"></a>

您通常会 AWS 区域 根据自己的业务模式和监管要求选择将多区域密钥复制到中。例如，您可以将密钥复制到保留资源的区域中。或者，为了符合灾难恢复要求，您可以将密钥复制到地理位置偏远的区域中。

以下是副本区域的 AWS KMS 要求。如果您选择的区域不符合这些要求，则尝试复制密钥失败。
+ **每个区域一个相关的多区域密钥** — 您不能在与主密钥相同的区域中创建副本密钥，也不能在与主密钥的另一个副本相同的区域中创建副本密钥。

  如果您尝试在已具有该主密钥副本的区域中复制主密钥，则尝试会失败。如果区域中的当前副本密钥处于 [`PendingDeletion` 密钥状态](key-state.md)，您可以[取消副本密钥删除](deleting-keys-scheduling-key-deletion.md)或者等待副本密钥被删除。
+ **同一区域中的多个不相关的多区域密钥** — 您可以在同一个区域中拥有多个不相关的多区域密钥。例如，您可以在 `us-east-1` 区域中拥有两个多区域主密钥。每个主密钥在 `us-west-2` 区域中都可以有一个副本密钥。
+ **同一分区中的区域** — 副本密钥区域必须位于与主密钥区域相同的 [AWS 分区](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)中。
+ **必须启用区域** — 如果某个区域[默认已禁用](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html#rande-manage-enable)，则无法在该区域中创建任何资源，直到为您的 AWS 账户启用该区域为止。

## 步骤 2：创建副本密钥
<a name="create-replica-keys"></a>

**注意**  
创建副本密钥时，请谨慎考虑您选择用于管理和使用副本密钥的 IAM 用户和角色。IAM policy 可以向其他 IAM 用户和角色授予管理 KMS 密钥的权限。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。

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

在 AWS KMS 控制台中，您可以在同一个操作中创建多区域主密钥的一个或多个副本。

此过程类似于在控制台中创建标准的单区域 KMS 密钥。但是，由于副本密钥基于主密钥，因此您不能为[共享属性](multi-region-keys-overview.md#mrk-sync-properties)选择值，例如密钥规范（对称或非对称）、密钥用法或密钥来源。

您可以指定不共享的属性，包括别名、标签、描述和密钥策略。为方便起见，控制台会显示主密钥的当前属性值，但您可以更改它们。即使您保留了主键值，也 AWS KMS 不会使这些值保持同步。

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

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. 选择[多区域主密钥](multi-region-keys-overview.md#mrk-primary-key)的密钥 ID 或别名。此操作将打开 KMS 密钥的密钥详细信息页面。

   要识别多区域主密钥，请使用右上角的工具图标将 **Regionality**（区域性）列添加到表中。

1. 选择 **Regionality**（区域性）选项卡。

1. 在 **Related multi-Region keys**（相关的多区域密钥）部分中，选择 **Create new replica keys**（创建新的副本密钥）。

   **Related multi-Region keys**（相关的多区域密钥）部分显示主密钥及其副本密钥的区域。您可以使用此显示来帮助您为新副本密钥选择区域。

1. 选择一个或多个 AWS 区域。此过程将在您选择的每个区域中创建一个副本密钥。

   该菜单仅包含与主键位于同一 AWS 分区中的区域。已具有相关多区域密钥的区域显示出来，但不可选。您可能没有权限将密钥复制到菜单上的所有区域。

   完成选择 Regions（区域）后，关闭菜单。将显示您选择的区域。要取消复制到某个区域，请选择 Region（区域）名称旁边的 **X**。

1. 为副本密钥键入[别名](kms-alias.md)。

   控制台将显示主密钥的当前别名之一，但您可以对其进行更改。您可以为多区域主密钥及其副本密钥指定相同的别名或不同的别名。别名不是多区域密[钥的共享属性](multi-region-keys-overview.md#mrk-sync-properties)。 AWS KMS 不会同步多区域密钥的别名。

   添加、删除或更新别名可以允许或拒绝对 KMS 密钥的权限。有关详细信息，请参阅 [ABAC for AWS KMS](abac.md) 和 [使用别名控制对 KMS 密钥的访问](alias-authorization.md)。

1. （可选）键入副本密钥的描述。

   控制台将显示主密钥的当前描述，但您可以对其进行更改。描述不是多区域密钥的共享属性。您可以为多区域主密钥及其副本提供相同的描述或不同的描述。 AWS KMS 不同步多区域密钥的密钥描述。

1. （可选）键入标签键和一个可选标签值。要为副本密钥分配多个标签，请选择 **Add tag**（添加标签）。

   控制台将显示当前附加到主密钥的标签，但您可以更改它们。标签不是多区域密钥的共享属性。您可以为多区域主密钥及其副本指定相同的标签或不同的标签。 AWS KMS 不会同步多区域密钥的标签。

   标记或取消标记 KMS 密钥可以允许或拒绝对 KMS 密钥的权限。有关详细信息，请参阅 [ABAC for AWS KMS](abac.md) 和 [使用标签控制对 KMS 密钥的访问](tag-authorization.md)。

1. 选择可管理副本密钥的 IAM 用户和角色。
**注意**  
 如果您在创建多区域主密钥时修改了默认密钥策略，则控制台将不会在创建副本密钥期间提示您选择密钥管理员或密钥用户（第 11-15 步）。在这种情况下，您需要通过在**编辑密钥策略**步骤（第 17 步）中选择**编辑**，手动将密钥管理员和用户所需的权限添加到密钥策略中。
此步骤将开始为副本密钥创建[密钥策略](key-policies.md)的过程。控制台将显示主密钥的当前密钥策略，但您可以对其进行更改。密钥策略不是多区域密钥的共享属性。您可以为多区域主密钥及其副本提供相同的密钥策略或不同的密钥策略。 AWS KMS 不同步密钥策略。您可以随时更改任何 KMS 密钥的密钥策略。
 AWS KMS 控制台在语句标识符下将密钥管理员添加到密钥策略中`"Allow access for Key Administrators"`。如果修改此语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）要阻止选定 IAM 用户和角色删除此 KMS 密钥，请在页面底部的**密钥删除**部分中，清除**允许密钥管理员删除此密钥**复选框。

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

1. 选择可将 KMS 密钥用于[加密操作](kms-cryptography.md#cryptographic-operations)的 IAM 用户和角色。
**备注**  
 AWS KMS 控制台在语句标识符`"Allow use of the key"`和下将密钥用户添加到密钥策略中`"Allow attachment of persistent resources"`。如果修改这些语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）您可以允许其他人使用 AWS 账户 此 KMS 密钥进行加密操作。为此，请在页面底部的**其他 AWS 账户**部分中选择**添加其他 AWS 账户**，然后输入外部账户的 AWS 账户 标识号。要添加多个外部账户，请重复此步骤。
**注意**  
要允许外部账户中的委托人使用 KMS 密钥，外部账户的管理员必须创建提供这些权限的 IAM policy。有关更多信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。

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

1. 检查密钥的密钥策略语句。要对密钥策略进行更改，请选择**编辑**。

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

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

1. 选择**完成**以创建多区域副本密钥。

### 使用 AWS KMS API
<a name="replicate-api"></a>

要创建多区域副本密钥，请使用[ReplicateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReplicateKey.html)操作。您不能使用该[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作来创建副本密钥。此操作一次创建一个副本密钥。您指定的区域必须符合副本密钥的[区域要求](#replica-region)。

当您使用 `ReplicateKey` 操作时，无需为多区域密钥的任何[共享属性](multi-region-keys-overview.md#mrk-sync-properties)指定值。共享属性值从主密钥复制并保持同步。但是，您可以为未共享的属性指定值。否则， AWS KMS 将应用 KMS 密钥的标准默认值，而不是主密钥的值。

**注意**  
如果您没有为、或`Tags`参数指定值 `Description``KeyPolicy`，则使用空字符串描述、[默认密钥策略且不使用标签 AWS KMS 创建副本密钥](key-policy-default.md)。  
不要在 `Description` 或 `Tags` 字段中包含机密或敏感信息。这些字段可能以纯文本形式出现在 CloudTrail 日志和其他输出中。

例如，以下命令在亚太地区（悉尼）区域 (ap-southeast-2) 中创建一个多区域副本密钥。此副本密钥基于美国东部（弗吉尼亚北部）区域 (us-east-1) 中的主密钥建模，它由 `KeyId` 参数的值进行标识。此示例接受所有其他属性的默认值，包括密钥策略。

响应描述了新的副本密钥。它包含共享属性的字段，例如 `KeyId`、`KeySpec`、`KeyUsage` 和密钥材料来源 (`Origin`)。它还包括独立于主密钥的属性，例如 `Description`、密钥策略 (`ReplicaKeyPolicy`) 和标签 (`ReplicaTags`)。

响应还包括主密钥的密钥 ARN 和区域及其所有副本密钥，包括刚刚在 ap-southeast-2 区域中创建的密钥。在此示例中，`ReplicaKey` 元素表明此主密钥已在欧洲（爱尔兰）区域 (eu-west-1) 复制。

```
$ aws kms replicate-key \
    --key-id arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab \
    --replica-region ap-southeast-2
{
    "ReplicaKeyMetadata": {
        "MultiRegion": true,
        "MultiRegionConfiguration": {
            "MultiRegionKeyType": "REPLICA",
            "PrimaryKey": {
                "Arn": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
                "Region": "us-east-1"
            },
            "ReplicaKeys": [
                {
                    "Arn": "arn:aws:kms:ap-southeast-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
                    "Region": "ap-southeast-2"
                },
                {
                    "Arn": "arn:aws:kms:eu-west-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
                    "Region": "eu-west-1"
                }
            ]
        },
        "AWSAccountId": "111122223333",
        "Arn": "arn:aws:kms:ap-southeast-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
        "CreationDate": 1607472987.918,
        "Description": "",
        "Enabled": true,
        "KeyId": "mrk-1234abcd12ab34cd56ef1234567890ab",
        "KeyManager": "CUSTOMER",
        "KeySpec": "SYMMETRIC_DEFAULT",
        "KeyState": "Enabled",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "Origin": "AWS_KMS",
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ]
    },
    "ReplicaKeyPolicy": "{\n  \"Version\" : \"2012-10-17\",\n  \"Id\" : \"key-default-1\",...,
    "ReplicaTags": []
}
```

# 删除具有导入密钥材料的 KMS 密钥
<a name="importing-keys-conceptual"></a>

导入的密钥材料允许您在生成的加密密钥下保护您的 AWS 资源。以下概述说明了如何将密钥材料导入 AWS KMS。要了解该过程中每个步骤的更多详细信息，请参阅相应主题。

1. [创建不具有密钥材料的 KMS 密钥](importing-keys-create-cmk.md) - 源必须是 `EXTERNAL`。密钥来源为`EXTERNAL`表示密钥是为导入的密钥材料设计的，因此无法 AWS KMS 为 KMS 密钥生成密钥材料。在后面的步骤中，您会将自己的密钥材料导入此 KMS 密钥中。

   您导入的密钥材料必须与关联 AWS KMS 密钥的密钥规范兼容。有关兼容性的更多信息，请参阅[导入密钥材料的要求](#importing-keys-material-requirements)。

1. [下载包装公有密钥和导入令牌](importing-keys-get-public-key-and-token.md) – 在完成步骤 1 后，请下载公有密钥和导入令牌。当您的密钥材料导入时，这些物品可以保护您的密钥材料 AWS KMS。

   在此步骤中，您将选择 RSA 包装密钥的类型（“密钥规范”）以及用于加密向 AWS KMS传输的传输中数据的包装算法。每次导入或重新导入相同的密钥材料时，您可以选择不同的包装密钥规范和包装密钥算法。

1. [加密密钥材料](importing-keys-encrypt-key-material.md) – 使用在步骤 2 中下载的包装公有密钥加密您在自己的系统上创建的密钥材料。

1. [导入密钥材料](importing-keys-import-key-material.md) – 上传您在步骤 3 中创建的已加密的密钥材料以及您在步骤 2 中下载的导入令牌。

   在此阶段，您可以[设置可选的过期时间](importing-keys-import-key-material.md#importing-keys-expiration)。导入的密钥材料过期后，将其 AWS KMS 删除，KMS 密钥将无法使用。要继续使用该 KMS 密钥，您必须重新导入相同****的密钥材料。

   导入操作成功完成后，KMS 密钥的密钥状态将从 `PendingImport` 变为 `Enabled`。现在，您可以在加密操作中使用 KMS 密钥。

AWS KMS 在[创建 KMS 密钥、下载封装公钥](ct-createkey.md)[和导入令牌以及导入密钥](ct-getparametersforimport.md)[材料时，会在 AWS CloudTrail 日志中](ct-importkeymaterial.md)记录一个条目。 AWS KMS 还会在您删除导入的密钥材料或 AWS KMS [删除过期的密钥材料](ct-deleteexpiredkeymaterial.md)时记录一个条目。

## 导入密钥材料的权限
<a name="importing-keys-permissions"></a>

要使用导入的密钥材料创建和管理 KMS 密钥，用户需要在此过程中执行操作的权限。在您创建 KMS 密钥时，您可以在密钥策略中提供 `kms:GetParametersForImport`、`kms:ImportKeyMaterial` 和 `kms:DeleteImportedKeyMaterial` 权限。在 AWS KMS 控制台中，当您使用**外部**密钥材料来源创建密钥时，会自动为密钥管理员添加这些权限。

若要使用导入的密钥材料创建 KMS 密钥，委托人需要以下权限。
+ [kms: CreateKey](customer-managed-policies.md#iam-policy-example-create-key)（IAM 策略）
  + 要将此权限限制为使用已导入密钥材料的 [KMS 密钥，请使用值为 kms: KeyOrigin](conditions-kms.md#conditions-kms-key-origin) 策略条件`EXTERNAL`。

    ```
    {
      "Sid": "CreateKMSKeysWithoutKeyMaterial",
      "Effect": "Allow",
      "Resource": "*",
      "Action": "kms:CreateKey",
      "Condition": {
        "StringEquals": {
          "kms:KeyOrigin": "EXTERNAL"
        }
      }
    }
    ```
+ [kms: GetParametersForImport](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html)（密钥策略或 IAM 策略）
  + 要将此权限限制为使用特定包装算法和封装密钥规范的请求，请使用 k [ms: WrappingAlgorithm](conditions-kms.md#conditions-kms-wrapping-algorithm) 和 k [ms: WrappingKeySpec](conditions-kms.md#conditions-kms-wrapping-key-spec) 策略条件。
+ [kms: ImportKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html)（密钥策略或 IAM 策略）
  + 要允许或禁止过期的密钥材料并控制过期日期，请使用 [kms: ExpirationModel](conditions-kms.md#conditions-kms-expiration-model) 和 [kms: ValidTo](conditions-kms.md#conditions-kms-valid-to) 策略条件。

要重新导入导入的密钥材料，委托人需要 k [ms: GetParametersForImport](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html) 和 [kms: ImportKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html) 权限。

要删除导入的密钥材料，委托人需要 [kms: DeleteImportedKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteImportedKeyMaterial.html) 权限。

例如，要授予示例使用导入的密钥材料管理 KMS 密钥所有方面的 `KMSAdminRole` 权限，请在 KMS 密钥的密钥策略中加入如下所示的密钥策略声明。

```
{
  "Sid": "Manage KMS keys with imported key material",
  "Effect": "Allow",
  "Resource": "*",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/KMSAdminRole"
  },
  "Action": [
    "kms:GetParametersForImport",
    "kms:ImportKeyMaterial",
    "kms:DeleteImportedKeyMaterial"
  ]  
}
```

## 导入密钥材料的要求
<a name="importing-keys-material-requirements"></a>

您导入的密钥材料必须与相关 KMS 密钥的[密钥规范](create-keys.md#key-spec)兼容。对于非对称密钥对，仅导入密钥对的私钥。 AWS KMS 从私钥派生公钥。

AWS KMS 支持使用导入的密钥材料的 KMS 密钥的以下密钥规范。
+ **对称加密密钥**
  + **密钥规范：**
    + SYMMETRIC\$1DEFAULT。
  + **要求：**
    + 256 位（32 字节）的二进制数据。
    + 在中国区域，必须是 128 位（16 字节）的二进制数据。
+ **HMAC 密钥**
  + **密钥规范：**
    + HMAC\$1224
    + HMAC\$1256
    + HMAC\$1384
    + HMAC\$1512
  + **要求：**
    + HMAC 密钥材料必须符合 [RFC 2104](https://datatracker.ietf.org/doc/html/rfc2104)。
    + 密钥长度必须至少为密钥规范指定的长度。最大密钥长度为 1024 位。
    + 如果密钥材料的长度超过 1024 位，则可以对密钥材料进行哈希处理，然后导入哈希输出。哈希算法必须与您要创建的 HMAC KMS 密钥的密钥规范相匹配。
  + **示例**：
    + 要将 2048 位的密钥材料导入 HMAC\$1256 密钥，请先计算 2048 位密钥材料的 SHA-256 哈希值，然后将生成的 256 位哈希输出导入 KMS 密钥。
  + **有效的密钥长度：**
    + HMAC\$1224：224–1024 位
    + HMAC\$1256：256–1024 位
    + HMAC\$1384：384–1024 位
    + HMAC\$1512：512–1024 位
+ **RSA 非对称私有密钥**
  + **密钥规范：**
    + RSA\$12048
    + RSA\$13072
    + RSA\$14096
  + **要求：**
    + 您导入的 RSA 非对称私有密钥必须是符合 [RFC 3447](https://datatracker.ietf.org/doc/html/rfc3447/) 的密钥对的一部分。
    + **模数**：2048 位、3072 位或 4096 位
    + **素数数量**：2（不支持多素数 RSA 密钥）
    + 非对称密钥材料必须为 BER 编码或 DER 编码，采用符合 [RFC 5208](https://datatracker.ietf.org/doc/html/rfc5208) 的公有密钥密码术标准（PKCS）\$18 格式。
+ **椭圆曲线非对称私有密钥**
  + **密钥规范：**
    + ECC\$1NIST\$1P256 (secp256r1)
    + ECC\$1NIST\$1P384 (secp384r1)
    + ECC\$1NIST\$1P521 (secp521r1)
    + ECC\$1SECG\$1P256K1 (secp256k1)
    + ECC\$1N EDWARDS25519 IST\$1 (ed25519)
  + **要求：**
    + 您导入的 ECC 非对称私有密钥必须是符合 [RFC 5915](https://datatracker.ietf.org/doc/html/rfc5915/) 的密钥对的一部分。
    + **曲线：**NIST P-256、NIST P-384、NIST P-521、secp256k1、NIST Ed25519。
    + **参数**：仅限命名曲线（拒绝带有显式参数的 ECC 密钥）。
    + **公共点坐标**：可以是压缩坐标、未压缩坐标或投影坐标。
    + 非对称密钥材料必须为 BER 编码或 DER 编码，采用符合 [RFC 5208](https://datatracker.ietf.org/doc/html/rfc5208) 的公有密钥密码术标准（PKCS）\$18 格式。
+ **ML-DSA 密钥**
  + **密钥规范：**
    + ML\$1DSA\$144
    + ML\$1DSA\$165
    + ML\$1DSA\$187
**重要**  
不支持导入 ML-DSA 密钥。
+ **SM2 非对称私钥**（仅限中国区域）
  + **要求：**
    + 您导入的 SM2 非对称私钥必须是符合 0003 的密钥对的一部分。 GM/T 
    + **曲线：** SM2。
    + **参数：**仅限命名曲线（拒绝带有显式参数的SM2 关键帧）。
    + **公共点坐标**：可以是压缩坐标、未压缩坐标或投影坐标。
    + 非对称密钥材料必须为 BER 编码或 DER 编码，采用符合 [RFC 5208](https://datatracker.ietf.org/doc/html/rfc5208) 的公有密钥密码术标准（PKCS）\$18 格式。

# 第 1 步：创建 AWS KMS key 不带密钥的材料
<a name="importing-keys-create-cmk"></a>

默认情况下，在 AWS KMS 创建 KMS 密钥时会为您创建密钥材料。要改为导入自己的密钥材料，请先创建不带密钥材料的 KMS 密钥。然后导入密钥材料。要创建不带密钥材料的 KMS 密钥，请使用 AWS KMS 控制台或[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作。

要创建不具有密钥材料的密钥，请指定 `EXTERNAL` 的[源](create-keys.md#key-origin)。KMS 密钥的源属性是不可变的。创建密钥后，您就无法将为导入的密钥材料设计的 KMS 密钥转换为包含来自 AWS KMS 或任何其他来源的密钥材料的 KMS 密钥。

带 `EXTERNAL` 且无密钥材料的 KMS 密钥的[密钥状态](key-state.md)为 `PendingImport`。KMS 密钥可以无限保留在 `PendingImport` 状态。但是，您不能在加密操作中使用处于 `PendingImport` 状态的 KMS 密钥。导入密钥材料时，KMS 密钥的密钥状态会更改为 `Enabled`，您可以在加密操作中使用该密钥。

AWS KMS 在[创建 KMS 密钥、下载公钥](ct-createkey.md)[和导入令牌以及导入密钥](ct-getparametersforimport.md)[材料时，会在 AWS CloudTrail 日志中](ct-importkeymaterial.md)记录事件。 AWS KMS 还会在您[删除导入的密钥材料或 AWS KMS 删除](ct-deleteimportedkeymaterial.md)[过期的密钥材料](ct-deleteexpiredkeymaterial.md)时记录 CloudTrail 事件。

**Topics**
+ [

## 创建不带密钥材料的 KMS 密钥（控制台）
](#importing-keys-create-cmk-console)
+ [

## 创建不含密钥材料的 KMS 密钥 (AWS KMS API)
](#importing-keys-create-cmk-api)

## 创建不带密钥材料的 KMS 密钥（控制台）
<a name="importing-keys-create-cmk-console"></a>

您只需为导入的密钥材料创建一次 KMS 密钥。您可以根据需要多次将相同的密钥材料导入和重新导入到现有的 KMS 密钥中，但不能将不同的密钥材料导入一个 KMS 密钥。有关更多信息，请参阅 [步骤 2：下载包装公有密钥和导入令牌](importing-keys-get-public-key-and-token.md)。

要在您的 **客户管理型密钥** 表中查找带有导入的密钥材料的现有 KMS 密钥，请使用右上角的齿轮图标显示 KMS 密钥列表中的 **Origin**（源）列。导入的密钥的**源**值为**外部（导入密钥材料）**。

要使用导入的密钥材料创建 KMS 密钥，请首先按照[创建首选密钥类型的 KMS 密钥的说明](create-keys.md)操作，但以下情况除外。

选择密钥用法后，请执行以下操作：

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

1. 对于 **Key material origin**（密钥材料源），请选择 **External (Import key material)** [外部（导入密钥材料）]。

1. 选择**我了解使用导入密钥的安全性和持久性影响**旁边的复选框，表示您了解使用导入密钥材料的影响。要了解这些含义，请参阅[保护导入的密钥材料](import-keys-protect.md)。

1. 可选：要使用导入的密钥材料创建[多区域 KMS 密钥](multi-region-keys-overview.md)，请在**区域性**下选择**多区域密钥**。

1. 返回基本说明。对于该类型的所有 KMS 密钥，基本过程的其余步骤都相同。

选择**完成**时，您创建了一个 KMS 密钥，该密钥没有密钥材料，状态（[密钥状态](key-state.md)）为**待导入**。

但是，控制台不会返回到**客户托管密钥**表，而是显示一个页面，您可以在其中下载导入密钥材料所需的公有密钥和导入令牌。现在，您可以立即继续下载步骤，也可以选择**取消**停止下载。您可以随时返回此下载步骤。

下一步: [步骤 2：下载包装公有密钥和导入令牌](importing-keys-get-public-key-and-token.md)。

## 创建不含密钥材料的 KMS 密钥 (AWS KMS API)
<a name="importing-keys-create-cmk-api"></a>

要使用 [AWS KMS API](https://docs.aws.amazon.com/kms/latest/APIReference/) 创建不含密钥材料的对称加密 KMS 密钥，请发送`Origin`参数设置为`EXTERNAL`的[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)请求。以下示例说明如何使用 [AWS Command Line Interface (AWS CLI)](https://aws.amazon.com/cli/) 执行该操作。

```
$ aws kms create-key --origin EXTERNAL
```

该命令成功执行后，您会看到类似以下内容的输出。 AWS KMS 关键`Origin`是`EXTERNAL`，现在`KeyState`是`PendingImport`。

**提示**  
如果命令不成功，则可能会看到 `KMSInvalidStateException` 或 `NotFoundException`。您可以重试请求。

```
{
    "KeyMetadata": {
        "Origin": "EXTERNAL",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "Description": "",
        "Enabled": false,
        "MultiRegion": false,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "PendingImport",
        "CreationDate": 1568289600.0,
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
        "AWSAccountId": "111122223333",
        "KeyManager": "CUSTOMER",
        "KeySpec": "SYMMETRIC_DEFAULT",
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ]
    }
}
```

从命令输出中复制 `KeyId` 值，以供后面的步骤使用，然后继续 [步骤 2：下载包装公有密钥和导入令牌](importing-keys-get-public-key-and-token.md)。

**注意**  
此命令创建对称加密 KMS 密钥，其 `KeySpec` 为 `SYMMETRIC_DEFAULT`，`KeyUsage` 为 `ENCRYPT_DECRYPT`。您可以使用可选参数 `--key-spec` 和 `--key-usage` 来创建非对称或 HMAC KMS 密钥。有关更多信息，请参阅 [CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html) 操作。

# 步骤 2：下载包装公有密钥和导入令牌
<a name="importing-keys-get-public-key-and-token"></a>

[创建不 AWS KMS key 带密钥材料](importing-keys-create-cmk.md)的后，使用 AWS KMS 控制台或 [GetParametersForImport](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html)API 下载包装公钥和该 KMS 密钥的导入令牌。包装公有密钥和导入令牌是一个不可分割的集合，必须一起使用。

您将使用包装公有密钥来[加密您的密钥材料](importing-keys-encrypt-key-material.md)以供传输。在下载 RSA 封装密钥对之前，请选择 RSA 封装密钥对的长度（密钥规范），以及将用于加密导入的密钥材料以便在[步骤](importing-keys-encrypt-key-material.md) 3 中传输的封装算法。 AWS KMS 还支持 SM2 包装密钥规范（仅限中国地区）。

每个包装公有密钥和导入令牌集的有效期为 24 小时。如果您不在 24 小时的下载期限内使用它们导入密钥材料，则必须下载新的公有密钥和令牌集。您可以随时下载新的包装公有密钥和导入令牌集。这使您可以更改 RSA 包装密钥长度（“密钥规范”）或替换丢失的集。

您也可以下载包装公有密钥和导入令牌，以将[相同的密钥材料重新导入](importing-keys-import-key-material.md#reimport-key-material) KMS 密钥中。您可以执行此操作来设置或更改密钥材料的过期时间，或者恢复过期或删除的密钥材料。每次将密钥材料导入时，都必须下载并重新加密密钥材料。 AWS KMS

**包装公有密钥的使用**  
下载内容包括您独有的公钥 AWS 账户，也称为*封装公钥*。  
在导入密钥材料之前，请使用公共封装密钥对密钥材料进行加密，然后将加密的密钥材料上传到 AWS KMS。 AWS KMS 收到您的加密密钥材料后，它会使用相应的私钥对密钥材料进行解密，然后在 AES 对称密钥下重新加密密钥材料，所有这些都在 AWS KMS 硬件安全模块 (HSM) 中完成。

**使用导入令牌**  
下载包括一个带有元数据的导入令牌，以确保您的密钥材料导入正确。将加密的密钥材料上传到时 AWS KMS，必须上传在此步骤中下载的相同导入令牌。

## 选择包装公有密钥规范
<a name="select-wrapping-key-spec"></a>

为了在导入过程中保护您的密钥材料，您可以使用从中 AWS KMS下载的封装公钥和支持的[封装算法](#select-wrapping-algorithm)对其进行加密。您在下载包装公有密钥和导入令牌之前选择密钥规范。所有封装密钥对都是在 AWS KMS 硬件安全模块 (HSMs) 中生成的。私有密钥永远不会让 HSM 处于纯文本状态。

**RSA 包装密钥规范**  
包装公有密钥的密钥规范**决定了 RSA 密钥对中密钥的长度，该密钥对在传输到 AWS KMS的过程中可以保护您的密钥材料。一般来说，我们建议使用实用的最长的包装公有密钥。我们提供了几种封装公钥规范，以支持各种 HSMs 密钥管理器。  
AWS KMS 支持以下用于导入所有类型密钥材料的 RSA 封装密钥的关键规范，除非另有说明。  
+ RSA\$14096（推荐）
+ RSA\$13072
+ RSA\$12048
**注意**  
不支持以下组合：ECC\$1NIST\$1P521 密钥材料、RSA\$12048 公有包装密钥规范和 RSAES\$1OAEP\$1SHA\$1\$1 包装算法。  
您不能使用 RSA\$12048 公有包装密钥直接包装 ECC\$1NIST\$1P521 密钥材料。使用更大的包装密钥或 RSA\$1AES\$1KEY\$1WRAP\$1SHA\$1\$1 包装算法。

**SM2 包装密钥规范（仅限中国地区）**  
AWS KMS 支持以下用于导入非对称密钥材料的 SM2 包装密钥的密钥规范。  
+ SM2

## 选择包装算法
<a name="select-wrapping-algorithm"></a>

要在导入过程中保护您的密钥材料，请使用下载的包装公有密钥和支持的包装算法为其加密。

AWS KMS 支持多种标准 RSA 封装算法和两步混合包装算法。通常，我们建议使用与您导入的密钥材料和[包装密钥规范](#select-wrapping-key-spec)兼容的最安全的包装算法。通常，选择硬件安全模块 (HSM) 支持的算法或用于保护密钥材料的密钥管理系统。

下表显示了每种类型的密钥材料和 KMS 密钥支持的包装算法。算法是以首选项顺序列出的。


| 密钥材料 | 支持的包装算法和规范 | 
| --- | --- | 
| 对称加密密钥 256 位 AES 密钥   128 位 SM4 密钥（仅限中国地区） |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/importing-keys-get-public-key-and-token.html)  | 
| 非对称 RSA 私有密钥  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/importing-keys-get-public-key-and-token.html)  | 
| 非对称椭圆曲线（ECC）私有密钥   您不能使用 RSAES\$1OAEP\$1SHA\$1\$1 包装算法和 RSA\$12048 包装密钥规范来包装 ECC\$1NIST\$1P521 密钥材料。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/importing-keys-get-public-key-and-token.html)  | 
| 非对称 SM2 私钥（仅限中国区域） |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/importing-keys-get-public-key-and-token.html)  | 
| HMAC 密钥 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/importing-keys-get-public-key-and-token.html)  | 

**注意**  
中国区域不支持 `RSA_AES_KEY_WRAP_SHA_256` 和 `RSA_AES_KEY_WRAP_SHA_1` 包装算法。
+ `RSA_AES_KEY_WRAP_SHA_256` – 一种两步混合包装算法，该算法将加密密钥材料与您生成的 AES 对称密钥相结合，然后使用下载的 RSA 公有包装密钥和 RSAES\$1OAEP\$1SHA\$1256 包装算法对 AES 对称密钥进行加密。

  除中国区域外，包装 RSA 私有密钥材料需要使用 `RSA_AES_KEY_WRAP_SHA_*` 包装算法。中国区域必须使用 `SM2PKE` 包装算法。
+ `RSA_AES_KEY_WRAP_SHA_1` – 一种两步混合包装算法，该算法将加密密钥材料与您生成的 AES 对称密钥相结合，然后使用下载的 RSA 包装公有密钥和 RSAES\$1OAEP\$1SHA\$11 包装算法对 AES 对称密钥进行加密。

  除中国区域外，包装 RSA 私有密钥材料需要使用 `RSA_AES_KEY_WRAP_SHA_*` 包装算法。中国区域必须使用 `SM2PKE` 包装算法。
+ `RSAES_OAEP_SHA_256` – RSA 加密算法，使用最优非对称加密填充 (OAEP) 与 SHA-256 哈希函数。
+ `RSAES_OAEP_SHA_1` – RSA 加密算法，使用最优非对称加密填充 (OAEP) 与 SHA-1 哈希函数。
+ `RSAES_PKCS1_V1_5`（已弃用；自 2023 年 10 月 10 日起， AWS KMS 不支持 RSAES\$1 PKCS1 \$1V1\$15 包装算法）— 填充格式在 PKCS \$11 版本 1.5 中定义的 RSA 加密算法。
+ `SM2PKE`（仅限中国地区）— OSCCA GM/T 在 0003.4-2012 中定义的基于椭圆曲线的加密算法。

**Topics**
+ [

## 选择包装公有密钥规范
](#select-wrapping-key-spec)
+ [

## 选择包装算法
](#select-wrapping-algorithm)
+ [

## 下载包装公有密钥和导入令牌（控制台）
](#importing-keys-get-public-key-and-token-console)
+ [

## 下载封装公钥和导入令牌 (AWS KMS API)
](#importing-keys-get-public-key-and-token-api)

## 下载包装公有密钥和导入令牌（控制台）
<a name="importing-keys-get-public-key-and-token-console"></a>

您可以使用 AWS KMS 控制台下载封装公钥和导入令牌。

1. 如果您刚刚完成[创建不带密钥材料的 KMS 密钥](importing-keys-create-cmk.md#importing-keys-create-cmk-console)的步骤并且您位于 **Download wrapping key and import token**（下载包装密钥和导入令牌）页面上，请跳至 [Step 10](#id-wrap-step)。

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

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

1. 在导航窗格中，选择**客户托管密钥**。
**提示**  
您只能将密钥材料导入**源**为**外部（导入密钥材料）**的 KMS 密钥中。这指示已创建不带密钥材料的 KMS 密钥。要向表中添加 **Origin (源)** 列，请在页面右上角，选择设置图标 (![\[Gear or cog icon representing settings or configuration options.\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/images/console-icon-settings-new.png))。打开 **Origin (源)**，然后选择 **Confirm (确认)**。

1. 选择待导入的 KMS 密钥的别名或密钥 ID。

1. 选择 **Cryptographic configuration**（加密配置）选项卡并查看其值。这些选项卡在 **General configuration**（常规配置）部分下。

   您只能将密钥材料导入**源**为**外部（导入密钥材料）**的 KMS 密钥。有关创建带已导入密钥材料的 KMS 密钥的信息，请参阅 [导入密钥的 AWS KMS 密钥材料](importing-keys.md)。

1. 根据您的密钥类型选择相应的选项卡。
   + 对于非对称密钥和 HMAC 密钥，请选择密**钥材料**选项卡。
   + 对于对称加密密钥，请选择密**钥材料和轮换**选项卡。

1. 选择导入操作。
   + 对于非对称密钥和 HMAC 密钥，请选择**导入密钥材料**。
   + 对于对称加密密钥，请选择以下选项之一：
     + **导入初始密钥材料**（如果尚未导入任何密钥材料）
     + **导入新的密钥材料**（添加用于轮换的新材料）
     + **重新导入密钥材料**（可在密钥材料表的 “**操作**” 菜单中找到）
**注意**  
对于多区域密钥，您必须先将新的密钥材料导入主区域密钥中。然后，将相同的密钥材料导入每个副本区域密钥。  
对于主多区域密钥，密**钥材料**表包括一个**副本导入状态**列，该列显示所有副本区域的导入状态（例如，“3 个已导入的 0 个”）。选择副本导入状态值以打开一个显示每个副本区域导入状态的模式。该模态为尚未**导入新密钥材料**的副本区域提供导入密钥材料链接。

1. 对于**选择包装密钥规范**，选择您的 KMS 密钥的配置。创建此密钥后，您无法更改密钥规范。

1. <a name="id-wrap-step"></a>对于**选择包装算法**，请选择您将用于为密钥材料加密的选项。有关这些选项的详细信息，请参阅[选择包装算法](#select-wrapping-algorithm)。

1. 选择**下载包装公有密钥和导入令牌**，然后保存文件。

   如果有 **Next (下一步)** 选项，而且要立即继续执行此过程，请选择 **Next (下一步)**。要稍后再继续，请选择 **Cancel (取消)**。

1. 解压缩 `.zip` 文件，即您在上一步 (`Import_Parameters_<key_id>_<timestamp>`) 中保存的文件。

   此文件夹包含以下文件：
   + 名为 `WrappingPublicKey.bin` 的文件中的包装公有密钥。
   + 名为 `ImportToken.bin` 的文件中的导入令牌。
   + 名为 README.txt 的文本文件。此文件包含以下相关信息：包装公有密钥、用于为密钥材料加密的包装算法，以及包装公有密钥和导入令牌的过期日期和时间。

1. 要继续执行此过程，请参阅[为您的密钥材料加密](importing-keys-encrypt-key-material.md)。

## 下载封装公钥和导入令牌 (AWS KMS API)
<a name="importing-keys-get-public-key-and-token-api"></a>

要下载公钥和导入令牌，请使用 [GetParametersForImport](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html)API。指定将与导入的密钥材料关联的 KMS 密钥。此 KMS 密钥的 [Origin](create-keys.md#key-origin) 值必须为 `EXTERNAL`。

**注意**  
不能导入 ML-DSA KMS 密钥的密钥材料。

此示例指定了 `RSA_AES_KEY_WRAP_SHA_256` 包装算法、RSA\$13072 包装公有密钥规范和示例密钥 ID。将这些示例值替换为有效的下载值。在此操作中，对于密钥 ID，您可以使用[密钥 ID](concepts.md#key-id-key-id) 或[密钥 ARN](concepts.md#key-id-key-ARN)，但不能使用[别名名称](concepts.md#key-id-alias-name)或[别名 ARN](concepts.md#key-id-alias-ARN)。

```
$ aws kms get-parameters-for-import \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --wrapping-algorithm RSA_AES_KEY_WRAP_SHA_256 \
    --wrapping-key-spec RSA_3072
```

该命令成功执行后，您会看到类似以下内容的输出：

```
{
    "ParametersValidTo": 1568290320.0,
    "PublicKey": "public key (base64 encoded)",
    "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "ImportToken": "import token (base64 encoded)"
}
```

为了准备下一步的数据，base64 会对公有密钥和导入令牌进行解码，并将解码后的值保存在文件中。

要对公有密钥进行 base64 解码并导入令牌：

1. 复制 base64 编码的公钥（*public key (base64 encoded)*在示例输出中用表示），将其粘贴到新文件中，然后保存该文件。向文件提供一个描述性名称，例如 `PublicKey.b64`。

1. 使用 [OpenSSL](https://openssl.org/) 对文件的内容进行 base64 解码，然后将解码后的数据保存到一个新文件中。以下示例会对您在上一步骤 (`PublicKey.b64`) 中保存的文件中的数据进行解码，并将输出保存到一个名为 `WrappingPublicKey.bin` 的新文件中。

   ```
   $ openssl enc -d -base64 -A -in PublicKey.b64 -out WrappingPublicKey.bin
   ```

1. 复制 base64 编码的导入令牌（*import token (base64 encoded)*在示例输出中用表示），将其粘贴到新文件中，然后保存该文件。为文件指定一个描述性名称，例如 `importtoken.b64`。

1. 使用 [OpenSSL](https://openssl.org/) 对文件的内容进行 base64 解码，然后将解码后的数据保存到一个新文件中。以下示例会对您在上一步骤 (`ImportToken.b64`) 中保存的文件中的数据进行解码，并将输出保存到一个名为 `ImportToken.bin` 的新文件中。

   ```
   $ openssl enc -d -base64 -A -in importtoken.b64 -out ImportToken.bin
   ```

继续执行[步骤 3：加密密钥材料](importing-keys-encrypt-key-material.md)。

# 步骤 3：加密密钥材料
<a name="importing-keys-encrypt-key-material"></a>

[下载公有密钥和导入令牌](importing-keys-get-public-key-and-token.md)后，使用您下载的公有密钥和指定的包装算法对密钥材料进行加密。如果您需要替换公有密钥或导入令牌，或者更改包装算法，则必须下载新的公有密钥和导入令牌。有关 AWS KMS 支持的公钥和封装算法的信息，请参阅[选择包装公有密钥规范](importing-keys-get-public-key-and-token.md#select-wrapping-key-spec)和[选择包装算法](importing-keys-get-public-key-and-token.md#select-wrapping-algorithm)。

密钥材料必须采用二进制格式。有关详细信息，请参阅 [导入密钥材料的要求](importing-keys-conceptual.md#importing-keys-material-requirements)。

**注意**  
对于非对称密钥对，仅加密和导入私钥。 AWS KMS 从私钥派生公钥。  
不支持以下组合：ECC\$1NIST\$1P521 密钥材料、RSA\$12048 公有包装密钥规范和 RSAES\$1OAEP\$1SHA\$1\$1 包装算法。  
您不能使用 RSA\$12048 公有包装密钥直接包装 ECC\$1NIST\$1P521 密钥材料。使用更大的包装密钥或 RSA\$1AES\$1KEY\$1WRAP\$1SHA\$1\$1 包装算法。  
中国区域不支持 RSA\$1AES\$1KEY\$1WRAP\$1SHA\$1256 和 RSA\$1AES\$1KEY\$1WRAP\$1SHA\$11 包装算法。

通常，您可以在将密钥材料从硬件安全模块 (HSM) 或密钥管理系统导出时对其进行加密。有关如何以二进制格式导出密钥材料的信息，请参阅有关 HSM 或密钥管理系统的文档。您还可以参阅以下部分，该部分使用 OpenSSL 提供了概念验证演示。

加密密钥材料时，请使用与您在[下载公有密钥和导入令牌](importing-keys-get-public-key-and-token.md)时指定的相同的包装算法。要查找您指定的包装算法，请参阅关联[GetParametersForImport](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html)请求的 CloudTrail 日志事件。

## 生成用于测试的密钥材料
<a name="importing-keys-example-key-material"></a>

以下 OpenSSL 命令生成每种支持类型的密钥材料以供测试。这些示例仅用于测试和 proof-of-concept演示。对于生产系统，请使用更安全的方法来生成您的密钥材料，例如硬件安全模块或密钥管理系统。

要将非对称密钥对的私有密钥转换为 DER 编码格式，请将密钥材料生成命令传送到以下 `openssl pkcs8` 命令。`topk8` 参数指示 OpenSSL 将私有密钥作为输入并返回 PKCS\$18 格式的密钥。（默认行为恰恰相反。） 

```
openssl pkcs8 -topk8 -outform der -nocrypt
```

以下命令为每种支持的密钥类型生成测试密钥材料。
+ 对称加密密钥（32 字节）

  此命令生成 256 位的对称密钥（32 字节的随机字符串）并将其保存在 `PlaintextKeyMaterial.bin` 文件中。您无需对这些密钥材料进行编码。

  ```
  openssl rand -out PlaintextKeyMaterial.bin 32
  ```

  仅在中国区域，您必须生成 128 位的对称密钥（16 字节的随机字符串）。

  ```
  openssl rand -out PlaintextKeyMaterial.bin 16
  ```
+ HMAC 密钥

  此命令生成指定大小的随机字节字符串。您无需对这些密钥材料进行编码。

  您的 HMAC 密钥的长度必须与 KMS 密钥的密钥规范定义的长度相匹配。例如，如果 KMS 密钥为 HMAC\$1384，则必须导入 384 位（48 字节）的密钥。

  ```
  openssl rand -out HMAC_224_PlaintextKey.bin 28
  
  openssl rand -out HMAC_256_PlaintextKey.bin 32
  
  openssl rand -out HMAC_384_PlaintextKey.bin 48
  
  openssl rand -out HMAC_512_PlaintextKey.bin 64
  ```
+ RSA 私有密钥

  ```
  openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:2048 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_2048_PrivateKey.der
  
  openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:3072 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_3072_PrivateKey.der
  
  openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_4096_PrivateKey.der
  ```
+ ECC 私有密钥

  ```
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P256_PrivateKey.der
  
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-384 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P384_PrivateKey.der
  
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-521 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P521_PrivateKey.der
  
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:secp256k1 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_SECG_P256K1_PrivateKey.der
  ```
+ SM2 私钥（仅限中国地区）

  ```
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:sm2 | openssl pkcs8 -topk8 -outform der -nocrypt > SM2_PrivateKey.der
  ```

## 使用 OpenSSL 加密密钥材料的示例
<a name="importing-keys-encrypt-key-material-openssl"></a>

以下示例说明如何使用 [OpenSSL](https://openssl.org/) 通过您下载的公有密钥对密钥材料进行加密。要使用 SM2 公钥加密密钥材料（仅限中国地区），请使用[`SM2OfflineOperationHelper`该](offline-operations.md#key-spec-sm-offline-helper)类。有关每种包装算法支持的密钥材料类型的更多信息，请参阅 [选择包装算法](importing-keys-get-public-key-and-token.md#select-wrapping-algorithm)。

**重要**  
这些示例仅为概念验证演示。对于生产系统，请使用更安全的方法 (如商业 HSM 或密钥管理系统) 来生成和存储您的密钥材料。  
不支持以下组合：ECC\$1NIST\$1P521 密钥材料、RSA\$12048 公有包装密钥规范和 RSAES\$1OAEP\$1SHA\$1\$1 包装算法。  
您不能使用 RSA\$12048 公有包装密钥直接包装 ECC\$1NIST\$1P521 密钥材料。使用更大的包装密钥或 RSA\$1AES\$1KEY\$1WRAP\$1SHA\$1\$1 包装算法。

------
#### [ RSAES\$1OAEP\$1SHA\$11 ]

AWS KMS 支持对称加密密钥 (SYMMETRIC\$1DEFAULT)、椭圆曲线 (ECC) 私钥、私钥和 HMAC 密钥的 RSAES\$1OAEP\$1SHA\$11。 SM2 

RSAES\$1OAEP\$1SHA\$11 不支持 RSA 私有密钥。此外，您不能使用采用任何 RSAES\$1OAEP\$1SHA\$1\$1 包装算法的 RSA\$12048 公有包装密钥来包装 ECC\$1NIST\$1P521（secp521r1）私有密钥。您必须使用更大的公有包装密钥或 RSA\$1AES\$1KEY\$1WRAP 包装算法。

以下示例使用[您下载的公有密钥](importing-keys-get-public-key-and-token.md)和 RSAES\$1OAEP\$1SHA\$11 包装算法对密钥材料进行加密，并将其保存在 `EncryptedKeyMaterial.bin` 文件中。

在本示例中：
+ *`WrappingPublicKey.bin`* 是包含下载的包装公有密钥的文件。
+ *`PlaintextKeyMaterial.bin`* 是包含您正在加密的密钥材料的文件，例如 `PlaintextKeyMaterial.bin`、`HMAC_384_PlaintextKey.bin` 或 `ECC_NIST_P521_PrivateKey.der`。

```
$ openssl pkeyutl \
    -encrypt \
    -in PlaintextKeyMaterial.bin \
    -out EncryptedKeyMaterial.bin \
    -inkey WrappingPublicKey.bin \
    -keyform DER \
    -pubin \
    -pkeyopt rsa_padding_mode:oaep \
    -pkeyopt rsa_oaep_md:sha1
```

------
#### [ RSAES\$1OAEP\$1SHA\$1256 ]

AWS KMS 支持对称加密密钥 (SYMMETRIC\$1DEFAULT)、椭圆曲线 (ECC) 私钥、私钥和 HMAC 密钥的 RSAES\$1OAEP\$1SHA\$1256。 SM2 

RSAES\$1OAEP\$1SHA\$1256 不支持 RSA 私有密钥。此外，您不能使用采用任何 RSAES\$1OAEP\$1SHA\$1\$1 包装算法的 RSA\$12048 公有包装密钥来包装 ECC\$1NIST\$1P521（secp521r1）私有密钥。您必须使用更大的公有密钥或 RSA\$1AES\$1KEY\$1WRAP 包装算法。

以下示例使用[您下载的公有密钥](importing-keys-get-public-key-and-token.md)和 RSAES\$1OAEP\$1SHA\$1256 包装算法对密钥材料进行加密，并将其保存在 `EncryptedKeyMaterial.bin` 文件中。

在本示例中：
+ *`WrappingPublicKey.bin`* 是包含已下载的公有包装密钥的文件。如果您是从控制台下载的公有密钥，则此文件的名称为 `wrappingKey_KMS key_key_ID_timestamp`（例如，`wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909`）。
+ *`PlaintextKeyMaterial.bin`* 是包含您正在加密的密钥材料的文件，例如 `PlaintextKeyMaterial.bin`、`HMAC_384_PlaintextKey.bin` 或 `ECC_NIST_P521_PrivateKey.der`。

```
$ openssl pkeyutl \
    -encrypt \
    -in PlaintextKeyMaterial.bin \
    -out EncryptedKeyMaterial.bin \
    -inkey WrappingPublicKey.bin \
    -keyform DER \
    -pubin \
    -pkeyopt rsa_padding_mode:oaep \
    -pkeyopt rsa_oaep_md:sha256 \
    -pkeyopt rsa_mgf1_md:sha256
```

------
#### [ RSA\$1AES\$1KEY\$1WRAP\$1SHA\$11 ]

RSA\$1AES\$1KEY\$1WRAP\$1SHA\$11 包装算法涉及两个加密操作。

1. 使用您生成的 AES 对称密钥和 AES 对称加密算法对密钥材料进行加密。

1. 使用您下载的公有密钥和 RSAES\$1OAEP\$1SHA\$11 包装算法加密您使用的 AES 对称密钥。

RSA\$1AES\$1KEY\$1WRAP\$1SHA\$11 包装算法需要 OpenSSL 版本 3.*x* 或更高版本。

1. 

**生成 256 位 AES 对称加密密钥**

   此命令生成由 256 个随机位组成的 AES 对称加密密钥，并将其保存在 `aes-key.bin` 文件中

   ```
   # Generate a 32-byte AES symmetric encryption key
   $ openssl rand -out aes-key.bin 32
   ```

1. 

**使用 AES 对称加密密钥加密您的密钥材料**

   此命令使用 AES 对称加密密钥对您的密钥材料进行加密，并将加密的密钥材料保存在 `key-material-wrapped.bin` 文件中。

   在此示例命令中：
   + *`PlaintextKeyMaterial.bin`* 是包含您要导入的密钥材料的文件，例如 `PlaintextKeyMaterial.bin`、`HMAC_384_PlaintextKey.bin`、`RSA_3072_PrivateKey.der` 或 `ECC_NIST_P521_PrivateKey.der`。
   + *`aes-key.bin`* 是包含您在上一个命令中生成的 256 位 AES 对称加密密钥的文件。

   ```
   # Encrypt your key material with the AES symmetric encryption key
   $ openssl enc -id-aes256-wrap-pad \
           -K "$(xxd -p < aes-key.bin | tr -d '\n')" \
           -iv A65959A6 \
           -in PlaintextKeyMaterial.bin \
           -out key-material-wrapped.bin
   ```

1. 

**使用公有密钥加密您的 AES 对称加密密钥**

   此命令使用您下载的公有密钥和 RSAES\$1OAEP\$1SHA\$11 包装算法对您的 AES 对称加密密钥进行加密，对其进行 DER 编码，然后将其保存在 `aes-key-wrapped.bin` 文件中。

   在此示例命令中：
   + *`WrappingPublicKey.bin`* 是包含已下载的公有包装密钥的文件。如果您是从控制台下载的公有密钥，则此文件的名称为 `wrappingKey_KMS key_key_ID_timestamp`（例如，`wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909`
   + *`aes-key.bin`* 是包含您在本示例序列的第一个命令中生成的 256 位 AES 对称加密密钥的文件。

   ```
   # Encrypt your AES symmetric encryption key with the downloaded public key
   $ openssl pkeyutl \
       -encrypt \
       -in aes-key.bin \
       -out aes-key-wrapped.bin \
       -inkey WrappingPublicKey.bin \
       -keyform DER \
       -pubin \
       -pkeyopt rsa_padding_mode:oaep \
       -pkeyopt rsa_oaep_md:sha1 \
       -pkeyopt rsa_mgf1_md:sha1
   ```

1. 

**生成要导入的文件**

   将文件与加密的密钥材料连接起来，并将文件与加密的 AES 密钥连接起来。将它们保存在 `EncryptedKeyMaterial.bin` 文件中，也就是您要在 [步骤 4：导入密钥材料](importing-keys-import-key-material.md) 中导入的文件。

   在此示例命令中：
   + *`key-material-wrapped.bin`* 是包含您的已加密密钥材料的文件。
   + *`aes-key-wrapped.bin`* 是包含已加密 AES 加密密钥的文件。

   ```
   # Combine the encrypted AES key and encrypted key material in a file
   $ cat aes-key-wrapped.bin key-material-wrapped.bin > EncryptedKeyMaterial.bin
   ```

------
#### [ RSA\$1AES\$1KEY\$1WRAP\$1SHA\$1256 ]

RSA\$1AES\$1KEY\$1WRAP\$1SHA\$1256 包装算法涉及两个加密操作。

1. 使用您生成的 AES 对称密钥和 AES 对称加密算法对密钥材料进行加密。

1. 使用您下载的公有密钥和 RSAES\$1OAEP\$1SHA\$1256 包装算法加密您使用的 AES 对称密钥。

RSA\$1AES\$1KEY\$1WRAP\$1SHA\$1256 包装算法需要 OpenSSL 版本 3.*x* 或更高版本。

1. 

**生成 256 位 AES 对称加密密钥**

   此命令生成由 256 个随机位组成的 AES 对称加密密钥，并将其保存在 `aes-key.bin` 文件中

   ```
   # Generate a 32-byte AES symmetric encryption key
   $ openssl rand -out aes-key.bin 32
   ```

1. 

**使用 AES 对称加密密钥加密您的密钥材料**

   此命令使用 AES 对称加密密钥对您的密钥材料进行加密，并将加密的密钥材料保存在 `key-material-wrapped.bin` 文件中。

   在此示例命令中：
   + *`PlaintextKeyMaterial.bin`* 是包含您要导入的密钥材料的文件，例如 `PlaintextKeyMaterial.bin`、`HMAC_384_PlaintextKey.bin`、`RSA_3072_PrivateKey.der` 或 `ECC_NIST_P521_PrivateKey.der`。
   + *`aes-key.bin`* 是包含您在上一个命令中生成的 256 位 AES 对称加密密钥的文件。

   ```
   # Encrypt your key material with the AES symmetric encryption key
   $ openssl enc -id-aes256-wrap-pad \
           -K "$(xxd -p < aes-key.bin | tr -d '\n')" \
           -iv A65959A6 \
           -in PlaintextKeyMaterial.bin \
           -out key-material-wrapped.bin
   ```

1. 

**使用公有密钥加密您的 AES 对称加密密钥**

   此命令使用您下载的公有密钥和 RSAES\$1OAEP\$1SHA\$1256 包装算法对您的 AES 对称加密密钥进行加密，对其进行 DER 编码，然后将其保存在 `aes-key-wrapped.bin` 文件中。

   在此示例命令中：
   + *`WrappingPublicKey.bin`* 是包含已下载的公有包装密钥的文件。如果您是从控制台下载的公有密钥，则此文件的名称为 `wrappingKey_KMS key_key_ID_timestamp`（例如，`wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909`
   + *`aes-key.bin`* 是包含您在本示例序列的第一个命令中生成的 256 位 AES 对称加密密钥的文件。

   ```
   # Encrypt your AES symmetric encryption key with the downloaded public key
   $ openssl pkeyutl \
       -encrypt \
       -in aes-key.bin \
       -out aes-key-wrapped.bin \
       -inkey WrappingPublicKey.bin \
       -keyform DER \
       -pubin \
       -pkeyopt rsa_padding_mode:oaep \
       -pkeyopt rsa_oaep_md:sha256 \
       -pkeyopt rsa_mgf1_md:sha256
   ```

1. 

**生成要导入的文件**

   将文件与加密的密钥材料连接起来，并将文件与加密的 AES 密钥连接起来。将它们保存在 `EncryptedKeyMaterial.bin` 文件中，也就是您要在 [步骤 4：导入密钥材料](importing-keys-import-key-material.md) 中导入的文件。

   在此示例命令中：
   + *`key-material-wrapped.bin`* 是包含您的已加密密钥材料的文件。
   + *`aes-key-wrapped.bin`* 是包含已加密 AES 加密密钥的文件。

   ```
   # Combine the encrypted AES key and encrypted key material in a file
   $ cat aes-key-wrapped.bin key-material-wrapped.bin > EncryptedKeyMaterial.bin
   ```

------

继续执行[步骤 4：导入密钥材料](importing-keys-import-key-material.md)。

# 步骤 4：导入密钥材料
<a name="importing-keys-import-key-material"></a>

在[加密密钥材料](importing-keys-encrypt-key-material.md)之后，您可以导入密钥材料，以将其与 AWS KMS key配合使用。要导入密钥材料，请上传在[步骤 3：加密密钥材料](importing-keys-encrypt-key-material.md)中加密的密钥材料以及在[步骤 2：下载包装公有密钥和导入令牌](importing-keys-get-public-key-and-token.md)中下载的导入令牌。您必须将密钥材料导入您在[下载公有密钥和导入令牌](importing-keys-get-public-key-and-token.md)时指定的同一 KMS 密钥中。成功导入密钥材料时，KMS 密钥的[密钥状态](key-state.md)会更改为 `Enabled`，您可以在加密操作中使用 KMS 密钥。

当您导入密钥材料时，您可以为密钥材料[设置可选的过期日期](#importing-keys-expiration)。当密钥材料过期后， AWS KMS 将删除密钥材料，并且 KMS 密钥将变为不可用。导入密钥材料后，无法设置、更改或取消当前导入的到期日期。要更改这些值，您必须[重新导入](#reimport-key-material)相同的密钥材料。

对于所有来源为 `EXTERNAL` 的 KMS 密钥，导入的第一个密钥材料将变为当前密钥材料并与之永久关联。带`EXTERNAL`来源的对称加密密钥支持按需轮换。您可以将多个密钥材料关联到支持按需轮换的导入的密钥。单区域和多区域密钥的导入新密钥材料的过程有所不同，如[导入新](#import-new-key-material)密钥材料一节中所述。要将新密钥材料`NEW_KEY_MATERIAL`与 KMS 密钥关联的[ImportKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html)操作，必须将`importType`参数设置为。可选 `ImportType` 参数的默认值为 `EXISTING_KEY_MATERIAL`。省略 `ImportType` 参数或将其指定为 `EXISTING_KEY_MATERIAL` 时，必须导入先前与 KMS 密钥关联的密钥材料。

对于非对称密钥或带有`EXTERNAL`来源的 HMAC KMS 密钥，只能将一种密钥材料与密钥相关联。 AWS KMS 将拒绝带`ImportType`参数[ ImportKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html)的 API 请求。

导入与 KMS 密钥永久关联的所有密钥材料后，KMS 密钥才可用于密码操作。如果删除其中任何一个密钥材料或放任其过期，则 KMS 密钥状态将变为 `PendingImport`，并且该密钥将不再能够用于密码操作。

要导入密钥材料，您可以使用[AWS KMS 控制台](#importing-keys-import-key-material-console)或 [ImportKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html)API。您可以直接使用 API，方法是发出 HTTP 请求，也可以使用[AWS SDKs](https://aws.amazon.com/tools/#sdk)、[AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/)或[AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/)。

导入密钥材料时，会在 AWS CloudTrail 日志中添加一个记录`ImportKeyMaterial`操作的[ImportKeyMaterial条](ct-importkeymaterial.md)目。无论您使用 AWS KMS 控制台还是 AWS KMS API， CloudTrail 条目都是一样的。

## 设置过期时间（可选）
<a name="importing-keys-expiration"></a>

导入 KMS 密钥的密钥材料时，可以将密钥材料的可选过期日期和时间设置为自导入之日起 365 天中的任意一天。导入的密钥材料过期后，将其 AWS KMS 删除。此操作会将 KMS 密钥的[密钥状态](key-state.md#key-state-table)更改为 `PendingImport`，这将阻止在任何加密操作中使用该密钥。要使用 KMS 密钥，您必须[重新导入原始密钥材料的副本](#reimport-key-material)。

确保导入的密钥材料经常过期，可帮助您满足监管要求，但这样做会给在 KMS 密钥下加密的数据带来额外的风险。在您重新导入原始密钥材料的副本之前，包含过期密钥材料的 KMS 密钥不可用，并且在 KMS 密钥下加密的任何数据都不可访问。如果您出于任何原因未能重新导入密钥材料（例如，丢失原始密钥材料的副本），则 KMS 密钥将永久不可用，在 KMS 密钥下加密的数据将无法恢复。

为了降低这种风险，请确保导入的密钥材料的副本可以访问，并设计一个系统，以便在密钥材料过期并中断工作量之前将其删除并重新导入。 AWS 我们建议您针对导入的密钥材料的过期[设置警报](imported-key-material-expiration-alarm.md)，这样您就有足够的时间在密钥材料过期之前重新导入密钥材料。您还可以使用 CloudTrail 日志来审核[导入（和重新导入）密钥材料和删除导入](ct-importkeymaterial.md)[的密钥材料](ct-deleteimportedkeymaterial.md)的 AWS KMS 操作，以及[删除过期密钥材料](ct-deleteexpiredkeymaterial.md)的操作。

AWS KMS 无法恢复、恢复或重现已删除的密钥材料。您可以通过编程定期[删除](importing-keys-delete-key-material.md)和[重新导入](#reimport-key-material)已导入的密钥材料，而无需设置过期时间，但是保留原始密钥材料副本的要求相同。

在导入密钥材料时，确定导入的密钥材料是否以及何时过期。不过，您可以开启和关闭过期时间，也可以通过重新导入密钥材料来设置新的过期时间。使用`ExpirationModel`参数开启[ImportKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html)到期时间 (`KEY_MATERIAL_EXPIRES`) 和关闭 (`KEY_MATERIAL_DOES_NOT_EXPIRE`)，使用`ValidTo`参数设置到期时间。自导入数据起的最大天数为 365 天；没有最短天数，但必须是未来时间。

## 设置密钥材料描述
<a name="set-key-material-description"></a>

具有`EXTERNAL`来源的对称加密密钥可以有多个与之关联的密钥材料。在将密钥材料导入此类密钥时，您可以指定可选的密钥材料描述。该描述可用于跟踪相应的密钥材料在 AWS KMS之外持久保存的位置。

对于多区域密钥，您只能在主区域密钥上设置或更改密钥材料描述。 AWS KMS 自动将密钥材料描述传播到副本区域密钥。

## 导入新密钥材料
<a name="import-new-key-material"></a>

要具有导入的密钥材料的对称加密 KMS 密钥执行按需轮换，您首先需要导入以前未与该密钥关联的新密钥材料。
+ **单一区域密钥**
  + 使用`ImportType`参数设置为的[ImportKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html)操作`NEW_KEY_MATERIAL`来完成此任务。在您执行[RotateKeyOnDemand](https://docs.aws.amazon.com/kms/latest/APIReference/API_RotateKeyOnDemand.html)操作或在中轮换密钥之前，此密钥材料不会与密钥永久关联 AWS 管理控制台。在此之前，此密钥材料将处于 `PENDING_ROTATION` 状态。一个 KMS 密钥在任何时候最多只能有一个密钥材料处于 `PENDING_ROTATION` 状态。可以删除处于`PENDING_ROTATION`状态的密钥材料，而不会影响密钥在加密操作中的可用性。
+ **多区域密钥**
  + 要将密钥材料导入多区域密钥，必须先将新的密钥材料导入主区域密钥。您不能直接将新的密钥材料导入副本区域密钥。将新的密钥材料导入主区域密钥后，您可以将相同的密钥材料导入到副本区域密钥中。
  + 使用将主区域键的`ImportType`参数设置**NEW\$1KEY\$1MATERIAL**为的[https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html)操作来完成此任务。对于副本区域密钥，请使用`ImportKeyMaterial`操作`ImportType`的**EXISTING\$1KEY\$1MATERIAL**参数。
  + 在密钥材料状态更改为状态之前，必须将对称加密多区域密钥的密钥材料导入到所有副本区域密钥和主区域密钥中。`PENDING_ROTATION`在此之前，新密钥材料的状态为`PENDING_MULTI_REGION_IMPORT_AND_ROTATION`。一个 KMS 密钥在任何时候最多可以有一个密钥材料`PENDING_MULTI_REGION_IMPORT_AND_ROTATION`处于`PENDING_ROTATION`或状态（参见中的`KeyMaterialState`描述 [RotationsListEntry](https://docs.aws.amazon.com/kms/latest/APIReference/API_RotationsListEntry.html)）。处于`PENDING_MULTI_REGION_IMPORT_AND_ROTATION`或`PENDING_ROTATION`状态的密钥材料不会与密钥永久关联，可以在不影响密钥在加密操作中的可用性的情况下将其删除。

## 重新导入密钥材料
<a name="reimport-key-material"></a>

如果您管理带有导入的密钥材料的 KMS 密钥，则可能需要重新导入密钥材料。您可以通过重新导入密钥材料替换过期或删除的密钥材料，或者更改密钥材料的到期模型或到期日期。

您可以在可满足您的安全要求任何时间点重新导入密钥材料。您不必等到密钥材料达到或接近其过期时间。

重新导入密钥材料的过程与首次导入密钥材料的过程相同，但以下情况例外。
+ 使用现有 KMS 密钥，而不是创建新的 KMS 密钥。您可以跳过导入过程的[步骤 1](importing-keys-create-cmk.md)。
+ 重新导入密钥材料时，您可以更改到期模型和到期日期。对于对称加密密钥，您还可以更改密钥材料描述。

  对于多区域密钥，您只能在主区域密钥上设置或更改密钥材料描述。 AWS KMS 自动将密钥材料描述传播到副本区域密钥。

每次将密钥材料导入 KMS 密钥时，您需要为 KMS 密钥[下载并使用新的包装密钥和导入令牌](importing-keys-get-public-key-and-token.md)。包装过程不会影响密钥材料的内容，因此，您可以使用不同的包装公有密钥和不同的包装算法来导入相同的密钥材料。

## 导入密钥材料（控制台）
<a name="importing-keys-import-key-material-console"></a>

您可以使用 AWS 管理控制台 来导入密钥材料。

1. 如果您在**上传已包装的密钥材料**页面上，请跳至 [Step 10](#id-key-materials-step)。

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. 选择已为其下载公有密钥和导入令牌的 KMS 密钥的密钥 ID 或别名。

1. 选择 **Cryptographic configuration**（加密配置）选项卡并查看其值。这些选项卡位于 **General configuration**（常规配置）部分下 KMS 密钥的详细信息页面上。

   您只能将密钥材料导入**源**为**外部（导入密钥材料）**的 KMS 密钥。有关创建带已导入密钥材料的 KMS 密钥的信息，请参阅 [导入密钥的 AWS KMS 密钥材料](importing-keys.md)。

1. 根据您的密钥类型选择相应的选项卡。
   + 对于非对称密钥和 HMAC 密钥，请选择密**钥材料**选项卡。
   + 对于对称加密密钥，请选择密**钥材料和轮换**选项卡。

1. 选择导入操作。
   + 对于非对称密钥和 HMAC 密钥，请选择**导入密钥材料**。
   + 对于对称加密密钥，请选择以下选项之一：
     + **导入初始密钥材料**（如果尚未导入任何密钥材料）
     + **导入新的密钥材料**（添加用于轮换的新材料）
     + **重新导入密钥材料**（可在密钥材料表的 “**操作**” 菜单中找到）
**注意**  
对于多区域密钥，您必须先将新的密钥材料导入主区域密钥中。然后，将相同的密钥材料导入每个副本区域密钥。  
对于主多区域密钥，密**钥材料**表包括一个**副本导入状态**列，该列显示所有副本区域的导入状态（例如，“3 个已导入的 0 个”）。选择副本导入状态值以打开一个显示每个副本区域导入状态的模式。该模态为尚未**导入新密钥材料**的副本区域提供导入密钥材料链接。

1. 如果您下载了密钥材料、导入令牌并加密了密钥材料，请选择**下一步**。
**注意**  
对于多区域密钥，您必须先将新的密钥材料导入主区域密钥中。然后，您可以将相同的密钥材料导入到副本区域密钥中。

1. <a name="id-key-materials-step"></a>在**加密的密钥材料和导入令牌**部分，执行以下操作。

   1. 在**包装的密钥材料**下，选择**选择文件**。然后上传包含您的已包装（已加密）密钥材料的文件。

   1. 在**导入令牌**下，选择**选择文件**。上传包含您[已下载](importing-keys-get-public-key-and-token.md#importing-keys-get-public-key-and-token-console)的导入令牌的文件。

1. 在 **Expiration option (过期选项)** 部分中，确定密钥材料是否过期。要设置到期日期和时间，请选择 **Key material expires (密钥材料过期)**，并使用日历选择日期和时间。您可以指定的日期距当前日期和时间最多 365 天。

1. 对于对称加密密钥，您可以选择为要导入的密钥材料指定描述。

1. 选择**导入密钥材料**。

## 导入密钥材料 (AWS KMS API)
<a name="importing-keys-import-key-material-api"></a>

要导入密钥材料，请使用[ImportKeyMaterial](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html)操作。以下示例使用 [AWS CLI](https://aws.amazon.com/cli/)，但您可以使用受支持的任何编程语言。

要使用此示例，请执行以下操作：

1. 将 `1234abcd-12ab-34cd-56ef-1234567890ab` 替换为您在下载公有密钥和导入令牌时指定的 KMS 密钥的密钥 ID。要标识 KMS 密钥，请使用其[密钥 ID](concepts.md#key-id-key-id) 或[密钥 ARN](concepts.md#key-id-key-ARN)。该操作不能使用[别名](concepts.md#key-id-alias-name)或[别名 ARN](concepts.md#key-id-alias-ARN)。

1. 将 `EncryptedKeyMaterial.bin` 替换为包含加密的密钥材料的文件的名称。

1. 将 `ImportToken.bin` 替换为包含导入令牌的文件的名称。

1. 如果希望导入的密钥材料过期，请将 `expiration-model` 参数的值设置为其默认值 `KEY_MATERIAL_EXPIRES`，或省略 `expiration-model` 参数。然后，将 `valid-to` 参数的值替换为您希望密钥材料过期的日期和时间。日期和时间最长为请求时间起 365 天。

   ```
   $ aws kms import-key-material --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
       --encrypted-key-material fileb://EncryptedKeyMaterial.bin \
       --import-token fileb://ImportToken.bin \
       --expiration-model KEY_MATERIAL_EXPIRES \
       --valid-to 2023-06-17T12:00:00-08:00
   ```

   如果不希望导入的密钥材料过期，请将 `expiration-model` 参数的值设置为 `KEY_MATERIAL_DOES_NOT_EXPIRE`，并从命令中省略 `valid-to` 参数。

   ```
   $ aws kms import-key-material --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
       --encrypted-key-material fileb://EncryptedKeyMaterial.bin \
       --import-token fileb://ImportToken.bin \
       --expiration-model KEY_MATERIAL_DOES_NOT_EXPIRE
   ```

1. 如果要导入以前未与 KMS 密钥关联的新密钥材料，请将 `ImportType` 参数设置为 `NEW_KEY_MATERIAL`。此选项只能与对称加密密钥一起使用。对于此类密钥，您还可以在以下命令行示例中使用可选 `KeyMaterialDescription` 参数为导入的密钥材料设置描述：

   ```
   $ aws kms import-key-material --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
       --encrypted-key-material fileb://EncryptedKeyMaterial.bin \
       --import-token fileb://ImportToken.bin \
       --expiration-model KEY_MATERIAL_EXPIRES \
       --valid-to 2023-06-17T12:00:00-08:00 \
       --import-type NEW_KEY_MATERIAL \
       --key-material-description "Q2 2025 Rotation"
   ```

1. 对于多区域密钥，您只能在主区域密钥上设置或更改密钥材料描述。 AWS KMS 自动将密钥材料描述传播到副本区域密钥。

**提示**  
如果命令不成功，则可能会看到 `KMSInvalidStateException` 或 `NotFoundException`。您可以重试请求。

# 在密钥库中创建 KMS AWS CloudHSM 密钥
<a name="create-cmk-keystore"></a>

创建 AWS CloudHSM 密钥库后，可以在密钥库 AWS KMS keys 中创建。它们必须是[对称加密 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)，其中包含 AWS KMS 生成的密钥材料。您不能在自定义密钥存储中创建[非对称 KMS 密钥](symmetric-asymmetric.md)、[HMAC KMS 密钥](hmac.md)或具有[导入的密钥材料](importing-keys.md)的 KMS 密钥。此外，您不能在自定义密钥存储中使用对称加密 KMS 密钥来生成非对称数据密钥对。KMS 无法 IPv6 与 AWS CloudHSM 密钥存储库进行通信。

要在密钥存储中创建 KMS 密 AWS CloudHSM 钥， AWS CloudHSM 密钥库必须[连接到关联的 AWS CloudHSM 集群](connect-keystore.md)，并且集群必须至少包含两个 HSMs 处于不同可用区域的活动密钥。要查找的连接状态和数量 HSMs，请查看中的[AWS CloudHSM 密钥存储页面](view-keystore.md#view-keystore-console) AWS 管理控制台。使用 API 操作时，使用[DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html)操作验证 AWS CloudHSM 密钥库是否已连接。要验证集群 HSMs 中的活动人数及其可用区，请使用 AWS CloudHSM [DescribeClusters](https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html)操作。

在密钥存储中创建 KMS AWS CloudHSM 密钥时， AWS KMS 会在中创建 KMS 密钥 AWS KMS。但是，它会为关联 AWS CloudHSM 集群中的 KMS 密钥创建密钥材料。具体而言， AWS KMS 以[您创建的 `kmsuser` CU 身份登录](create-keystore.md#before-keystore)集群。然后，它在集群中创建持久的、不可提取的 256 位高级加密标准 (AES) 对称密钥。 AWS KMS 将[密钥标签属性](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-key-attributes.html)的值（仅在集群中可见）设置为 KMS 密钥的 Amazon Resource Name (ARN)。

当命令成功时，新 KMS 密钥的[密钥状态](key-state.md)为 `Enabled`，其源为 `AWS_CLOUDHSM`。创建任何 KMS 密钥后便无法更改其源。当您在 AWS KMS 控制台的密 AWS CloudHSM 钥存储库中或使用[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)操作查看 KMS 密钥时，可以看到典型的属性，例如其密钥 ID、密钥状态和创建日期。但是，您也可以查看自定义密钥存储 ID 和（可选） AWS CloudHSM 集群 ID。

如果您尝试在密钥库中创建 KMS AWS CloudHSM 密钥失败，请使用错误消息来帮助您确定原因。这可能表示 AWS CloudHSM 密钥库未连接 (`CustomKeyStoreInvalidStateException`)，或者关联的 AWS CloudHSM 集群没有此操作所需的两个密钥库处于活动状态 HSMs (`CloudHsmClusterInvalidConfigurationException`)。有关帮助信息，请参阅[对自定义密钥存储进行故障排除](fix-keystore.md)。

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

## 在您的 CloudHSM 密钥存储中创建新 KMS 密钥
<a name="create-key-keystore"></a>

您可以通过 AWS KMS 控制台或使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作在密 AWS CloudHSM 钥存储库中创建对称加密 KMS 密钥。

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

使用以下过程在密钥库中创建对称加密 KMS AWS CloudHSM 密钥。

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

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. 对于**密钥材料源**，选择 **AWS CloudHSM 密钥存储**。

   您无法在密钥库中创建多区域 AWS CloudHSM 密钥。

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

1. 为您的新 KMS AWS CloudHSM 密钥选择密钥存储区。要创建新的 AWS CloudHSM 密钥库，请选择**创建自定义密钥库**。

   您选择的 AWS CloudHSM 密钥库的状态必须为 “已**连接**”。其关联的 AWS CloudHSM 集群必须处于活动状态，并且在不同的可用区中至少包含两个 HSMs 处于活动状态的集群。

   有关连接密 AWS CloudHSM 钥库的帮助，请参阅[断开密 AWS CloudHSM 钥库的连接](connect-keystore.md)。有关添加的帮助 HSMs，请参阅*AWS CloudHSM 用户指南*中的[添加 HSM](https://docs.aws.amazon.com/cloudhsm/latest/userguide/add-remove-hsm.html#add-hsm)。

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

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 policy 可以向其他 IAM 用户和角色授予使用 KMS 密钥的权限。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。  
 AWS KMS 控制台在语句标识符下将密钥管理员添加到密钥策略中`"Allow access for Key Administrators"`。如果修改此语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

1. （可选）要阻止这些密钥管理员删除此 KMS 密钥，请清除页面底部与 **Allow key administrators to delete this key**（允许密钥管理员删除此密钥）对应的框。

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

1. **在此账户**部分中，选择可以在[加密操作](kms-cryptography.md#cryptographic-operations)中使用 KMS 密钥的 IAM 用户和角色。 AWS 账户 有关更多信息，请参阅[允许密钥用户使用 KMS 密钥](key-policy-default.md#key-policy-default-allow-users)。
**注意**  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。  
 AWS KMS 控制台在语句标识符`"Allow use of the key"`和下将密钥用户添加到密钥策略中`"Allow attachment of persistent resources"`。如果修改这些语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

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

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

1. 检查密钥的密钥策略语句。要对密钥策略进行更改，请选择**编辑**。

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

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

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

操作成功后，屏幕上会显示您选择的密钥存储区中的新 KMS AWS CloudHSM 密钥。当您选择新 KMS 密钥的名称或别名时，其详细信息页面上的**加密配置**选项卡会显示 KMS 密钥的来源 (**AWS CloudHSM**)、自定义密钥存储的名称、ID 和类型以及 AWS CloudHSM 集群的 ID。如果此过程失败，则会出现一条描述失败的错误消息。

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

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

要在密钥库中创建新的 AWS KMS key （KMS AWS CloudHSM 密钥），请使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作。使用 `CustomKeyStoreId` 参数识别自定义密钥存储并指定 `Origin` 值 `AWS_CLOUDHSM`。

您可能还需要使用 `Policy` 参数指定密钥策略。您可以随时更改密钥策略 ([PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html)) 并添加可选元素，例如[描述](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)和[标签](https://docs.aws.amazon.com/kms/latest/APIReference/API_TagResource.html)。

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

以下示例首先调用该[DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html)操作以验证 AWS CloudHSM 密钥库是否已连接到其关联的 AWS CloudHSM 集群。默认情况下，此操作将返回您的账户和区域中的所有自定义密钥存储。要仅描述特定的 AWS CloudHSM 密钥库，请使用其`CustomKeyStoreId`或`CustomKeyStoreName`参数（但不能同时使用两者）。

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

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

```
$ aws kms describe-custom-key-stores --custom-key-store-id cks-1234567890abcdef0
{
   "CustomKeyStores": [
      "CustomKeyStoreId": "cks-1234567890abcdef0",
      "CustomKeyStoreName": "ExampleKeyStore",
      "CustomKeyStoreType": "AWS CloudHSM key store",
      "CloudHsmClusterId": "cluster-1a23b4cdefg",
      "TrustAnchorCertificate": "<certificate string appears here>",
      "CreationDate": "1.499288695918E9",
      "ConnectionState": "CONNECTED"
   ],
}
```

下一个示例命令使用该[DescribeClusters](https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html)操作来验证与 (cluster-1a23b4cdefg`ExampleKeyStore`) 关联的 AWS CloudHSM 集群是否至少有两个处于活动状态。 HSMs如果集群少于两个 HSMs，则`CreateKey`操作将失败。

```
$ aws cloudhsmv2 describe-clusters
{
    "Clusters": [
        {
            "SubnetMapping": {
               ...
            },
            "CreateTimestamp": 1507133412.351,
            "ClusterId": "cluster-1a23b4cdefg",
            "SecurityGroup": "sg-865af2fb",
            "HsmType": "hsm1.medium",
            "VpcId": "vpc-1a2b3c4d",
            "BackupPolicy": "DEFAULT",
            "Certificates": {
                "ClusterCertificate": "-----BEGIN CERTIFICATE-----\...\n-----END CERTIFICATE-----\n"
            },
            "Hsms": [
                {
                    "AvailabilityZone": "us-west-2a",
                    "EniIp": "10.0.1.11",
                    "ClusterId": "cluster-1a23b4cdefg",
                    "EniId": "eni-ea8647e1",
                    "StateMessage": "HSM created.",
                    "SubnetId": "subnet-a6b10bd1",
                    "HsmId": "hsm-abcdefghijk",
                    "State": "ACTIVE"
                },
                {
                    "AvailabilityZone": "us-west-2b",
                    "EniIp": "10.0.0.2",
                    "ClusterId": "cluster-1a23b4cdefg",
                    "EniId": "eni-ea8647e1",
                    "StateMessage": "HSM created.",
                    "SubnetId": "subnet-b6b10bd2",
                    "HsmId": "hsm-zyxwvutsrqp",
                    "State": "ACTIVE"
                },
            ],
            "State": "ACTIVE"
        }
    ]
}
```

此示例命令使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作在密钥库中创建 KMS AWS CloudHSM 密钥。要在密钥存储中创建 KMS AWS CloudHSM 密钥，必须提供密钥存储库的自定义 AWS CloudHSM 密钥存储 ID，并将`Origin`值指定为`AWS_CLOUDHSM`。

响应包括自定义密钥库和 AWS CloudHSM 集群的。 IDs 

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

```
$ aws kms create-key --origin AWS_CLOUDHSM --custom-key-store-id cks-1234567890abcdef0
{
  "KeyMetadata": {
    "AWSAccountId": "111122223333",
    "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "CreationDate": 1.499288695918E9,
    "Description": "Example key",
    "Enabled": true,
    "MultiRegion": false,
    "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
    "KeyManager": "CUSTOMER",
    "KeyState": "Enabled",
    "KeyUsage": "ENCRYPT_DECRYPT",    
    "Origin": "AWS_CLOUDHSM"
    "CloudHsmClusterId": "cluster-1a23b4cdefg",
    "CustomKeyStoreId": "cks-1234567890abcdef0"
    "KeySpec": "SYMMETRIC_DEFAULT",
    "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
    "EncryptionAlgorithms": [
        "SYMMETRIC_DEFAULT"
    ]
  }
}
```

# 在外部密钥存储中创建 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"
    }
  }
}
```