

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

# 与 AWS KMS keys
<a name="kms-keys"></a>

 AWS KMS key 是指可能引用一个或多个硬件安全模块 (HSM) 后备密钥 (HBKs) 的逻辑密钥。本主题说明了如何创建 KMS 密钥、导入密钥材料，以及如何启用、禁用、轮换和删除 KMS 密钥。

**注意**  
AWS KMS 正在将 “*客户主密钥 (CMK)*” 一词替换为 “*AWS KMS key*和 *KMS 密钥*”。这一概念并未改变。为了防止重大更改， AWS KMS 保留了该术语的一些变体。

本章介绍了从创建到删除的 KMS 密钥生命周期，如下图所示。

![\[KMS 密钥生命周期。\]](http://docs.aws.amazon.com/zh_cn/kms/latest/cryptographic-details/images/keystate.png)


**Topics**
+ [正在呼叫 CreateKey](create-key.md)
+ [导入密钥材料](importing-key-material.md)
+ [启用和禁用 密钥](enable-and-disable-key.md)
+ [删除 密钥](key-deletion.md)
+ [轮换密钥材料](rotate-customer-master-key.md)

# 正在呼叫 CreateKey
<a name="create-key"></a>

在 AWS KMS key 调用 [https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)API 时会生成一个。

以下是 [`CreateKey` 请求语法](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html#API_CreateKey_RequestSyntax)的子集。

```
{
  "Description": "string",
  "KeySpec": "string",
  "KeyUsage": "string",
  "Origin": "string";
  "Policy": "string"
}
```

请求接受采用 JSON 格式的以下数据。

**说明**  
（可选）密钥的描述。我们建议您选择可帮助您决定密钥是否适合某项任务的描述。

**KeySpec**  
指定要创建的 KMS 密钥的类型。默认值 SYMMETRIC\$1DEFAULT 会创建一个对称加密 KMS 密钥。对于对称加密密钥而言，此参数是可选的；对于所有其他密钥规范，则必须提供此参数。

**KeyUsage**  
指定密钥的用途。有效值为 `ENCRYPT_DECRYPT`、`SIGN_VERIFY` 或 `GENERATE_VERIFY_MAC`。默认值为 `ENCRYPT_DECRYPT`。对于对称加密密钥而言，此参数是可选的；对于所有其他密钥规范，则必须提供此参数。

** Origin**  
（可选）KMS 密钥的密钥材料来源。默认值为`AWS_KMS`，表示 AWS KMS 生成和管理 KMS 密钥的密钥材料。其他有效值包括`EXTERNAL`，它表示在没有密钥材料的情况下为[导入的密钥材料创建`AWS_CLOUDHSM`的 KMS 密](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)钥，以及在由您控制的 AWS CloudHSM 集群支持的[自定义密钥存储](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)中创建 KMS 密钥。

**Policy**  
（可选）要附加到密钥的策略。如果忽略该策略，将使用允许根账户和具有 AWS KMS 权限的 IAM 主体进行管理的原定设置策略（以下）创建该密钥。

有关此策略的详细信息，请参阅*AWS Key Management Service 开发人员指南*中的[AWS KMS中的密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)和[默认密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html)。

`CreateKey` 请求会返回一个包含密钥 ARN 的[响应](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html#API_CreateKey_ResponseSyntax)。

```
arn:<partition>:kms:<region>:<account-id>:key/<key-id>
```

如果 `Origin` 为 `AWS_KMS`，则在创建 ARN 后，将利用已通过身份验证的会话发出对某个 AWS KMS HSM 的请求，以预调配硬件安全模块（HSM）备用密钥（HBK）。HBK 是与 KMS 密钥的这一密钥 ID 关联的 256 位密钥。它只能在 HSM 上生成，并且设计为永远不会以明文形式导出到 HSM 边界之外。HBK 将利用当前域密钥 DK0 进行加密。 HBKs 这些经过加密的密钥令牌称为加密的密钥令牌 (EKTs)。尽管 HSMs 可以配置为使用各种密钥包装方法，但当前的实现在 Galois 计数器模式 (GCM) 中使用 AES-256，这是一种经过身份验证的加密方案。利用这种已通过身份验证的加密模式，可方便我们保护一些明文导出的密钥令牌元数据。

这在样式上表示为：

```
EKT = Encrypt(DK0, HBK)
```

为您的 KMS 密钥和后续密钥提供了两种基本的保护形式 HBKs：在您的 KMS 密钥上设置的授权策略和对关联 HBKs的 KMS 密钥的加密保护。其余部分描述了中管理功能的加密保护和安全性。 AWS KMS

除了 ARN 以外，您还可以为密钥创建一个*别名*，从而常见一个用户友好的名称并将其与 KMS 密钥关联。将别名与 KMS 密钥关联后，就可以在加密操作中使用别名来标识 KMS 密钥。有关详细信息，请参阅《AWS Key Management Service 开发人员指南》中的[使用别名](https://docs.aws.amazon.com/kms/latest/developerguide/kms-alias.html)。

KMS 密钥的使用有多个级别的授权。 AWS KMS 在加密内容和 KMS 密钥之间启用单独的授权策略。例如， AWS KMS 信封加密的 Amazon Simple Storage Service (Amazon S3) 对象会继承 Amazon S3 存储桶上的策略。但是，对必要加密密钥的访问权限由 KMS 密钥上的访问策略决定。有关 KMS 密钥授权的信息，请参阅《AWS Key Management Service 开发人员指南》中的[身份验证和访问控制 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)。

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

AWS KMS 提供了一种用于导入用于 HBK 的加密材料的机制。如中所述[正在呼叫 CreateKey](create-key.md)，如果将 CreateKey命令`Origin`设置为`EXTERNAL`，则会创建一个不包含底层 HBK 的逻辑 KMS 密钥。必须使用 [https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html) API 调用导入加密材料。您可以使用此功能来控制密钥创建和加密材料的持久性。如果您使用此功能，我们建议您在环境中处理这些密钥和持久性时格外小心。有关导入密钥材料的完整详细信息和建议，请参阅 *AWS Key Management Service 开发人员指南*中的[导入密钥材料](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)。

## 正在呼叫 ImportKeyMaterial
<a name="importkeymaterial"></a>

`ImportKeyMaterial` 请求导入 HBK 的必要加密材料。加密材料必须是 256 位对称密钥。它必须使用 `WrappingAlgorithm` 中指定的算法在最近 [https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html) 请求返回的公有密钥下进行加密。

[`ImportKeyMaterial` 请求](https://docs.aws.amazon.com/kms/latest/APIReference/API_ImportKeyMaterial.html#API_ImportKeyMaterial_RequestSyntax)使用以下参数：

```
{
  "EncryptedKeyMaterial": blob,
  "ExpirationModel": "string",
  "ImportToken": blob,
  "KeyId": "string",
  "ValidTo": number
}
```

**EncryptedKeyMaterial**  
导入的密钥材料使用 `GetParametersForImport` 请求中返回的公有密钥和该请求中指定的包装算法进行加密。

**ExpirationModel**  
指定密钥材料是否过期。该值为 `KEY_MATERIAL_EXPIRES` 时，`ValidTo` 参数必须包含到期日期。该值为 `KEY_MATERIAL_DOES_NOT_EXPIRE` 时，不包含 `ValidTo` 参数。有效值为 `"KEY_MATERIAL_EXPIRES"` 和 `"KEY_MATERIAL_DOES_NOT_EXPIRE"`。

**ImportToken**  
提供该公有密钥的同一 `GetParametersForImport` 请求返回的导入令牌。

**KeyId**  
将与导入的密钥材料关联的 KMS 密钥。KMS 密钥的 `Origin` 必须为 `EXTERNAL`。  
您可以删除并将*同一*导入的密钥材料重新导入指定的 KMS 密钥中，但无法导入任何其他密钥材料或将其与 KMS 密钥关联。

**ValidTo**  
（可选）导入的密钥材料过期的时间。当密钥材料过期后， AWS KMS 将删除密钥材料，并且 KMS 密钥将变为不可用。在 `ExpirationModel` 的值为 `KEY_MATERIAL_EXPIRES` 时，则必须提供此参数，否则无效。

请求成功后，如果提供了 KMS 密钥，则可在指定的到期日期 AWS KMS 之前使用。导入的密钥材料过期后，EKT 将从 AWS KMS 存储层中删除。

# 启用和禁用 密钥
<a name="enable-and-disable-key"></a>

禁用 KMS 密钥会阻止在加密操作中使用该密钥。它会暂停使用与 KMS 密钥关联的所有 HBKs 内容的权限。启用后可恢复对 HBKs 和 KMS 密钥的使用。[启用](https://docs.aws.amazon.com/kms/latest/APIReference/API_Enable.html)和[禁用](https://docs.aws.amazon.com/kms/latest/APIReference/API_Disable.html)是一种简单的请求，仅需 KMS 密钥的密钥 ID 或密钥 ARN 即可完成。

# 删除 密钥
<a name="key-deletion"></a>

授权用户可以使用 [https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html)API 安排删除 KMS 密钥及所有关联密钥 HBKs。这本质上是一种破坏性的操作，从 AWS KMS中删除密钥时应谨慎行事。 AWS KMS 在删除 KMS 密钥时，强制要求最短等待时间为七天。在等待期间，密钥处于禁用状态，密钥状态为**待删除**。所有使用该密钥进行加密操作的调用都将失败。 ScheduleKeyDeletion 采用以下参数。

```
{
  "KeyId": "string",
  "PendingWindowInDays": number
}
```

**KeyId**  
要删除的 KMS 密钥的唯一标识符。要指定该值，请使用 KMS 密钥的唯一密钥 ID 或密钥 ARN。

** PendingWindowInDays**  
（可选）等待期（单位为天）。该值为可选项。范围为 7-30 天，默认值为 30 天。等待期结束后， AWS KMS 删除 KMS 密钥和所有关联的密钥 HBKs。

# 轮换密钥材料
<a name="rotate-customer-master-key"></a>

授权用户可以为其客户管理型 KMS 密钥启用年度自动轮换。 AWS 托管式密钥 始终会每年轮换一次。

KMS 密钥轮换时，系统将创建一个新的 HBK，并将其标记为所有新加密请求所用密钥材料的当前版本。所有之前版本的 HBK 仍然会永久可供使用，以用于解密使用相应 HBK 版本加密的任何加密文字。由于 AWS KMS 不存储任何在 KMS 密钥下加密的密文，因此在较旧的、轮换的 HBK 下加密的密文需要 HBK 进行解密。您可以通过 [https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) API 以使用 KMS 密钥的新 HBK 或其他 KMS 密钥重新加密任何加密文字，而不暴露明文。

有关启用和禁用密钥轮换的信息，请参阅《AWS Key Management Service 开发人员指南》中的[轮换 Amazon KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)。