

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

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

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

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

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

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

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

  无法以明文形式从服务中导出 KMS 密钥。它们由服务使用的硬件安全模块 (HSMs) 生成，并且只能在其中使用。这是 Amazon 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 密钥的密钥材料源可能会有所不同。您可以使用 Amazon 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 Amazon 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 Amazon 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 Amazon KMS](abac.md)。
+ [km CreateKey s:](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html) 为必填项。
+ [km CreateAlias s:](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateAlias.html) 需要在控制台中创建 KMS 密钥，其中每个新的 KMS 密钥都需要一个别名。
+ [km TagResource s:](https://docs.amazonaws.cn/kms/latest/APIReference/API_TagResource.html) 需要在创建 KMS 密钥时添加标签。
+ CreateServiceLinkedRolei@@ [am:](https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateServiceLinkedRole.html) 是创建多区域主密钥所必需的。有关更多信息，请参阅 [控制对多区域密钥的访问](multi-region-keys-auth.md)。

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

KMS 密钥属于创建密钥的 Amazon 账户。创建 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)。 Amazon KMS 使用的对称加密算法快速、高效，并可确保数据的机密性和真实性。它支持具有附加身份验证数据 (AAD) 的身份验证加密，这些数据定义为[加密上下文](encrypt_context.md)。这种类型的 KMS 密钥要求加密数据的发送者和接收者都具有有效的通话 Amazon 凭证 Amazon KMS。  
如果您的用例要求无法呼叫的用户在外部 Amazon 进行加密 Amazon KMS，那么[非对称 KMS 密钥](symmetric-asymmetric.md)是一个不错的选择。您可以分发非对称 KMS 密钥的公有密钥，以允许这些用户对数据进行加密。需要解密该数据的应用程序，可以在 Amazon 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 密钥对。不过，您可能需要使用特定的密钥规范和签名算法来支持在 Amazon之外验证签名的用户。

**使用非对称密钥对加密**  
要使用非对称密钥对加密数据，必须使用具有 [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 密钥对的公有密钥为 Amazon KMS 中的数据进行加密，请使用 [Encrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html) 操作。您也可以[下载公钥](download-public-key.md)并与需要在外部加密数据的各方共享 Amazon KMS。  
下载非对称 KMS 密钥的公有密钥后，可以在 Amazon KMS外部使用该密钥。但它不再受保护 KMS 密钥的安全控制措施的约束 Amazon KMS。例如，您不能使用 Amazon KMS 密钥策略或授权来控制公钥的使用。您也无法控制密钥是否仅用于使用支持的加密算法进行加密和解密。 Amazon KMS 有关更多详细信息，请参阅[下载公有密钥的特殊注意事项](offline-public-key.md#download-public-key-considerations)。  
要解密使用外部公钥加密的数据，请调用 [Dec](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) rypt 操作。 Amazon KMS如果使用 `SIGN_VERIFY` 的密钥用法通过 KMS 密钥中的公有密钥对数据进行加密，则 `Decrypt` 操作会失败。如果使用 Amazon KMS 不支持您选择的密钥规范的算法对其进行加密，它也会失败。有关密钥规范和支持算法的更多信息，请参阅 [密钥规范引用](symm-asymm-choose-key-spec.md)。  
为避免这些错误，任何在之外使用公钥的人 Amazon KMS 都必须存储密钥配置。 Amazon KMS 控制台和[GetPublicKey](https://docs.amazonaws.cn/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)中国区域）密钥材料。 Amazon KMS 使用[椭圆曲线密码学辅助因子 Diffie-Hellman Priman Primitive (ECDH) 通过从两个对等体的椭圆曲线公私钥对中得出共享](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar3.pdf#page=60)密钥来建立密钥协议。您可以使用[ DeriveSharedSecret](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeriveSharedSecret.html)操作返回的原始共享密钥来派生对称密钥，该密钥可以加密和解密在双方之间发送的数据，或者生成和验证。 HMACs Amazon KMS 建议您在使用原始共享[密钥派生对称密钥时，遵循 NIST 关于](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Cr2.pdf)密钥派生的建议。

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

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

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