

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

# 外部密钥存储
<a name="keystore-external"></a>

外部密钥存储允许您使用外部的加密密钥来保护您的 Amazon 资源。 Amazon此高级功能专为受监管的工作负载设计，这些工作负载必须使用存储在您控制的外部密钥管理系统中的加密密钥加以保护。外部密钥存储支持[Amazon 数字主权承诺](https://www.amazonaws.cn/blogs/security/aws-digital-sovereignty-pledge-control-without-compromise/)，为您提供对数据的主权控制权 Amazon，包括能够使用您拥有并在外部控制的密钥材料进行加密 Amazon。

*外部密钥存储库*是由您拥有并在外部管理的*外部密钥管理器*支持的[自定义密钥存储](key-store-overview.md#custom-key-store-overview)库 Amazon。您的外部密钥管理器可以是物理或虚拟硬件安全模块 (HSMs)，也可以是任何能够生成和使用加密密钥的基于硬件或软件的系统。使用外部密钥存储库中的 KMS 密钥的加密和解密操作由您的外部密钥管理器使用您的加密密钥材料执行，该功能被称为 “*保留自己的密钥*” ()。HYOKs

Amazon KMS 切勿直接与外部密钥管理器交互，也无法创建、查看、管理或删除您的密钥。相反，仅与您提供的[外部密钥存储代理](#concept-xks-proxy)（XKS 代理）软件进行 Amazon KMS 交互。您的外部密钥存储代理负责调解与您的外部密钥管理器 Amazon KMS 之间的所有通信。它会将来自 Amazon KMS 您的外部密钥管理器的所有请求传送回您的外部密钥管理器，并将来自外部密钥管理器的响应传回到。 Amazon KMS外部密钥存储代理还将来自 Amazon KMS 的通用请求转换为外部密钥管理器可以理解的供应商特定格式，允许您将外部密钥存储与来自不同供应商的密钥管理器一起使用。

您可以在外部密钥存储中使用 KMS 密钥进行客户端加密，包括使用 [Amazon Encryption SDK](https://docs.amazonaws.cn/encryption-sdk/latest/developer-guide/)。但是外部密钥存储是服务器端加密的重要资源，它允许您使用外部的加密密钥对 Amazon 资源 Amazon Web Services 服务 进行多重保护。 Amazon Amazon Web Services 服务 支持用于对称加密的[客户托管密钥](concepts.md#customer-mgn-key)还支持外部密钥存储中的 KMS 密钥。有关服务支持的详细信息，请参阅 [Amazon 服务集成](https://www.amazonaws.cn/kms/features/#AWS_service_integration)。

外部密钥存储允许您 Amazon KMS 用于受监管的工作负载，在这些工作负载中，加密密钥必须在外部存储和使用 Amazon。不过，这样的工作负载与标准责任共担模型相去甚远，会造成额外的运营负担。对大多数客户而言，可用性和延迟的更大风险将超过外部密钥存储的预期安全优势。

外部密钥存储允许您控制信任根密钥。在外部密钥存储中以 KMS 密钥加密的数据，只能使用您控制的外部密钥管理器进行解密。如果您暂时撤消对外部密钥管理器的访问权限，例如断开外部密钥存储库的连接或断开外部密钥管理器与外部密钥存储代理的连接，则在恢复加密密钥之前，将 Amazon 失去对加密密钥的所有访问权限。在此期间，无法解密以 KMS 密钥加密的加密文字。如果您永久撤消对外部密钥管理器的访问权限，在外部密钥存储中以 KMS 密钥加密的所有加密文字都不可恢复。唯一的例外是那些会短暂缓存受您的 KMS [密钥保护的数据](data-keys.md)密钥的 Amazon 服务。这些数据密钥将继续有效，直到您停用资源或缓存过期。有关更多信息，请参阅 [不可用的 KMS 密钥如何影响数据密钥](unusable-kms-keys.md)。

外部密钥存储可以解锁受监管工作负载的少数用例，在这些用例中，加密密钥必须完全由您控制且无法访问 Amazon。不过，这是您运营基于云的基础设施方式的重大变化，也是责任共担模型的重大转变。对大多数工作负载而言，额外的运营负担以及可用性和性能的更大风险将超过外部密钥存储所带来的预期安全优势。



**我需要外部密钥存储吗？**

对于大多数用户来说，默认 Amazon KMS 密钥存储区受到 [FIPS 140-3 安全等级 3 验证的硬件安全模块](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4884)的保护，可以满足他们的安全、控制和监管要求。外部密钥存储用户会承担大量成本、维护和故障排除负担，以及与延迟、可用性和可靠性有关的风险。

在考虑外部密钥存储时，请花点时间了解替代方案，包括由您拥有和管理的 Amazon CloudHSM 集群支持的密[Amazon CloudHSM 钥存储库](keystore-cloudhsm.md)，以及包含您自己生成 HSMs 并可以按需从 KMS 密钥中删除的[导入密钥材料](importing-keys.md)的 KMS 密钥。特别要注意的是，导入过期间隔非常短的密钥材料可以提供类似级别的控制，却不会带来性能或可用性风险。

如果您有以下要求，则外部密钥存储可能是适合您组织的解决方案：
+ 您需要在本地密钥管理器中使用加密密钥，或者在您控制范围之外的密钥管理器中使用加密密钥。 Amazon 
+ 您必须证明，在云端之外，您加密密钥的保留完全由自己控制。
+ 您必须使用具有独立授权的加密密钥进行加密和解密。
+ 密钥材料必须受辅助、独立的审计路径的约束。

如果您选择外部密钥存储，请将其使用限制在需要使用 Amazon之外的加密密钥进行保护的工作负载。



**责任共担模式**

标准 KMS 密钥使用在中生成和使用的密钥材料 HSMs ，由其 Amazon KMS 拥有和管理。您可以在 KMS 密钥上建立访问控制策略，并配置 Amazon Web Services 服务 该策略使用 KMS 密钥来保护您的资源。 Amazon KMS 负责您的 KMS 密钥中密钥材料的安全性、可用性、延迟和耐久性。

外部密钥存储中的 KMS 密钥依赖外部密钥管理器中的密钥材料和操作。因此，责任的天平朝着您的方向移动。您对外部密钥管理器中加密密钥的安全性、可靠性、耐用性和性能负责。 Amazon KMS 负责迅速响应请求并与您的外部密钥存储代理进行通信，并负责维护我们的安全标准。[*为确保每个外部密钥存储的密文至少与标准密文一样强，请 Amazon KMS 先使用您的 KMS Amazon KMS 密钥特有的 Amazon KMS 密钥材料对所有明文进行加密，然后将其发送到您的外部密钥管理器以使用您的外部密钥进行加密，这种过程称为双重加密。*](#concept-double-encryption)因此，无论是 Amazon KMS 还是外部密钥材料的所有者，都无法单独解密双重加密的加密文字。

您要对以下事项负责：维护符合您监管和性能标准的外部密钥管理器，提供和维护符合 [Amazon KMS 外部密钥存储代理 API 规范](https://github.com/aws/aws-kms-xksproxy-api-spec/)的外部密钥存储代理，以及确保密钥材料的可用性和持久性。您还必须创建、配置和维护外部密钥存储。当出现由您维护的组件引起的错误时，您必须做好识别和解决错误的准备，以便 Amazon 服务能够在不造成不当干扰的情况下访问您的资源。 Amazon KMS 提供[故障排除指导](xks-troubleshooting.md)，帮助您确定问题的原因和最可能的解决方案。

查看 Amazon KMS 记录外部密钥存储的 [Amazon CloudWatch 指标和维度](monitoring-cloudwatch.md#kms-metrics)。 Amazon KMS 强烈建议您创建 CloudWatch 警报来监控您的外部密钥存储，这样您就可以在性能和操作问题出现之前检测到这些问题的早期迹象。

**发生了什么变化？**

外部密钥存储仅支持对称加密 KMS 密钥。在内部 Amazon KMS，您使用和管理外部密钥存储库中的 KMS 密钥的方式与管理其他[客户托管密钥](concepts.md#customer-mgn-key)的方式大致相同，包括[设置访问控制策略](authorize-xks-key-store.md)和[监控密钥使用](monitoring-overview.md)情况。对于用于任何 KMS 密钥的外部密钥存储库中的 KMS 密钥，您可以使用相同的参数来请求加密操作。 APIs 定价也与标准 KMS 密钥相同。有关详细信息，请参阅 [外部密钥存储中的 KMS 密钥](keystore-external-key-manage.md) 和 [Amazon Key Management Service 定价](https://www.amazonaws.cn/kms/pricing/)。

不过，使用外部密钥存储时，以下原则会发生变化：
+ 您对密钥操作的可用性、持久性和延迟负责。
+ 您对外部密钥管理器系统的开发、购买、运营和许可的所有费用负责。
+ 您可以对来自 Amazon KMS 外部密钥存储代理的所有请求实施[独立授权](authorize-xks-key-store.md#xks-proxy-authorization)。
+ 您可以监控、审核和记录外部密钥存储代理的所有操作以及外部密钥管理器中与 Amazon KMS 请求相关的所有操作。

**从何处开始？**

要创建和管理外部密钥存储，您需要[选择外部密钥存储代理连接选项](choose-xks-connectivity.md)、[汇编先决条件](create-xks-keystore.md#xks-requirements)，然后[创建和配置外部密钥存储](create-xks-keystore.md)。

**配额**

Amazon KMS 允许每个 Amazon Web Services 账户 和区域中最多有 [10 个自定义密钥存储库](resource-limits.md)，包括[Amazon CloudHSM 密钥存储库](https://docs.amazonaws.cn/kms/latest/developerguide/keystore-cloudhsm.html)和[外部密钥存储库](https://docs.amazonaws.cn/kms/latest/developerguide/keystore-external.html)，无论其连接状态如何。此外，[使用外部密钥存储中 KMS 密钥](requests-per-second.md#rps-key-stores) 存在 Amazon KMS 请求限额。

如果您为外部密钥存储[代理选择 VPC 代理连接](#concept-xks-connectivity)，则所需组件（例如 VPCs子网和网络负载均衡器）也可能有配额。有关这些限额的信息，请使用[服务限额控制台](https://console.amazonaws.cn/servicequotas/home)。



**区域**

为了最大限度地减少网络延迟，请在离[外部密钥管理器](#concept-ekm)最近的 Amazon Web Services 区域 中创建外部密钥存储组件。如果可行，请选择网络往返时间（RTT）不超过 35 毫秒的区域。

除中国（北京）和中国（宁夏）外， Amazon KMS 所有支持外部密钥存储的 Amazon Web Services 区域 地区均支持外部密钥存储。

**不支持的功能**

Amazon KMS 不支持自定义密钥存储库中的以下功能。
+ [非对称 KMS 密钥](symmetric-asymmetric.md)
+ [HMAC KMS 密钥](hmac.md)
+ [具有导入密钥材料的 KMS 密钥](importing-keys.md)
+ [自动密钥轮换](rotate-keys.md)
+ [多区域密钥](multi-region-keys-overview.md)

**了解更多：**
+ *Amazon 新闻博客*中的[宣布推出 Amazon KMS 外部密钥存储](https://www.amazonaws.cn/blogs/aws/announcing-aws-kms-external-key-store-xks/)。

## 外部密钥存储概念
<a name="xks-concepts"></a>

了解外部密钥存储中使用的基本术语和概念。

### 外部密钥存储
<a name="concept-external-key-store"></a>

*外部密钥存储库*是由您拥有和管理的外部密钥管理器支持的 Amazon KMS [自定义密钥存储](key-store-overview.md#custom-key-store-overview)库。 Amazon 外部密钥存储中的每个 KMS 密钥都与您外部密钥管理器中的[外部密钥](#concept-external-key)相关联。在外部密钥存储中使用 KMS 密钥进行加密或解密时，该操作将在您的外部密钥管理器中使用您的外部密钥执行，这种安排称为*持有自己的密钥*（HYOK）。此功能专为需要在自己的外部密钥管理器中维护加密密钥的组织设计。

外部密钥存储可确保保护您的 Amazon 资源的加密密钥和操作保留在您的外部密钥管理器中，由您控制。 Amazon KMS 向您的外部密钥管理器发送请求以加密和解密数据，但 Amazon KMS 无法创建、删除或管理任何外部密钥。来自 Amazon KMS 外部密钥管理器的所有请求均由您提供、拥有和管理的[外部密钥存储代理](#concept-xks-proxy)软件组件进行中介。

Amazon 支持 Amazon KMS [客户托管密钥](concepts.md)的服务可以使用外部密钥存储区中的 KMS 密钥来保护您的数据。因此，您的数据最终由使用您外部密钥管理器中的加密操作的密钥进行保护。

与标准 KMS 密钥相比，外部密钥存储中的 KMS 密钥具有根本上不同的信任模型、[责任共担安排](#xks-shared-responsibility)和性能预期。使用外部密钥存储时，您要对密钥材料和加密操作的安全性和完整性负责。外部密钥存储中 KMS 密钥的可用性和延迟情况，受硬件、软件、网络组件以及 Amazon KMS 与外部密钥管理器之间的距离的影响。您还可能会为外部密钥管理器以及外部密钥管理器与之通信所需的网络和负载平衡基础设施支付额外费用 Amazon KMS

您可以将外部密钥存储作为更广泛的数据保护策略的一部分加以使用。对于您保护的每项 Amazon 资源，您可以决定哪些资源需要在外部密钥存储中使用 KMS 密钥，哪些可以由标准 KMS 密钥保护。这可以让您灵活地为特定的数据分类、应用程序或项目选择 KMS 密钥。

### 外部密钥管理器
<a name="concept-ekm"></a>

*外部密钥管理器*是 Amazon 之外的组件，可以生成 256 位 AES 对称密钥并执行对称加密和解密。外部密钥存储的外部密钥管理器，可以是实体硬件安全模块（HSM）、虚拟 HSM 或带/不带 HSM 组件的软件密钥管理器。它可以位于外部的任何地方 Amazon，包括您的本地、本地或远程数据中心或任何云中。您的外部密钥存储可以由单个外部密钥管理器提供支持，也可以由共享加密密钥的多个相关密钥管理器实例（例如 HSM 集群）提供支持。外部密钥存储旨在支持来自不同供应商的各种外部管理器。有关连接外部密钥管理器的详细信息，请参阅 [选择外部密钥存储代理连接选项](choose-xks-connectivity.md)。

### 外部密钥
<a name="concept-external-key"></a>

外部密钥存储中的每个 KMS 密钥都与[外部密钥管理器](#concept-ekm)中的加密密钥（称为*外部密钥*）相关联。在使用外部密钥存储中的 KMS 密钥加密或解密时，将使用外部密钥在[外部密钥管理器](#concept-ekm)中执行加密操作。

**警告**  
外部密钥对 KMS 密钥的操作至关重要。如果外部密钥丢失或遭删除，则以相关 KMS 密钥加密的加密文字将无法恢复。

使用外部密钥存储时，外部密钥必须是已启用且可以执行加密和解密的 256 位 AES 密钥。有关详细的外部密钥要求，请参阅 [外部密钥存储中 KMS 密钥的要求](create-xks-keys.md#xks-key-requirements)。

Amazon KMS 无法创建、删除或管理任何外部密钥。您的加密密钥材料永远不会离开外部密钥管理器。在外部密钥存储中创建 KMS 密钥时，您需要提供外部密钥的 ID（`XksKeyId`）。您无法更改与 KMS 密钥关联的外部密钥 ID，即便外部密钥管理器可以轮换与外部密钥 ID 关联的密钥材料。

除了外部密钥，外部密钥存储中的 KMS 密钥还具有 Amazon KMS 密钥材料。受 KMS 密钥保护的数据首先 Amazon KMS 使用密 Amazon KMS 钥材料进行加密，然后由您的外部密钥管理器使用您的外部密钥进行加密。这种[双重加密](#concept-double-encryption)过程可确保受您 KMS 密钥保护的加密文字始终至少与仅受 Amazon KMS保护的加密文字一样强大。

许多加密密钥具有不同类型的标识符。在外部密钥存储中创建 KMS 密钥时，您要提供[外部密钥存储代理](#concept-xks-proxy)用来引用外部密钥的外部密钥 ID。如果使用了错误的标识符，尝试在外部密钥存储中创建 KMS 密钥会失败。

### 外部密钥存储代理
<a name="concept-xks-proxy"></a>

*外部密钥存储代理*（“XKS 代理”）是客户拥有和客户管理的软件应用程序，用于调解与您的外部密钥管理器 Amazon KMS 之间的所有通信。它还将通用 Amazon KMS 请求转换为供应商特定的外部密钥管理器可以理解的格式。外部密钥存储需要外部密钥存储代理。每个外部密钥存储会关联一个外部密钥存储代理。

![\[外部密钥存储代理\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/xks-proxy-concept-40.png)


Amazon KMS 无法创建、删除或管理任何外部密钥。您的加密密钥材料永远不会离开外部密钥管理器。 Amazon KMS 与您的外部密钥管理器之间的所有通信均由您的外部密钥存储代理进行中介。 Amazon KMS 向外部密钥存储代理发送请求并接收来自外部密钥存储代理的响应。外部密钥存储代理负责将请求从您的外部密钥管理器传输 Amazon KMS 到您的外部密钥管理器，并将来自外部密钥管理器的响应传回到 Amazon KMS

您拥有并管理外部密钥存储的外部密钥存储代理，并负责其维护和操作。您可以根据开源外部密钥存储代理 API 规范开发[外部密钥存储代理 API 规范，该规范](https://github.com/aws/aws-kms-xksproxy-api-spec/) Amazon KMS 发布或从供应商那里购买代理应用程序。您的外部密钥存储代理可能包含在您的外部密钥管理器中。为了支持代理开发， Amazon KMS 还提供了外部密钥存储代理示例 ([aws-kms-xks-proxy](https://github.com/aws-samples/aws-kms-xks-proxy)) 和测试客户端 ([xks-kms-xksproxy-test-client](https://github.com/aws-samples/aws-kms-xksproxy-test-client))，用于验证您的外部密钥存储代理是否符合规范。

要进行身份验证 Amazon KMS，代理使用服务器端 TLS 证书。要向您的代理进行身份验证， Amazon KMS 请使用 Sigv4 代理[身份验证](#concept-xks-credential)凭据对外部密钥存储代理的所有请求进行签名。

您的外部密钥存储代理必须支持 HTTP/1.1 或更高版本以及 TLS 1.2 或更高版本，并至少使用以下密码套件之一：
+ TLS\$1AES\$1256\$1GCM SHA384 \$1 (TLS 1.3)
+ TLS\$1 \$1 CHACHA20 POLY1305 \$1 SHA256 (TLS 1.3)
**注意**  
 Amazon GovCloud (US) Region 不支持 TLS\$1 CHACHA20 \$1 POLY1305。SHA256
+ TLS\$1ECDHE\$1RSA\$1WITH SHA384 \$1AES\$1256\$1GCM\$1 (TLS 1.2)
+ TLS\$1ECDHE\$1ECDSA\$1WITH SHA384 \$1AES\$1256\$1GCM\$1 (TLS 1.2)

要在外部密钥存储中创建和使用 KMS 密钥，必须先[将外部密钥存储连接到](xks-connect-disconnect.md)其外部密钥存储代理。您也可以根据需要断开外部密钥存储与其代理的连接。在这样做时，外部密钥存储中的所有 KMS 密钥都会变得[不可用](key-state.md)，也不能用于任何加密操作。

### 外部密钥存储代理连接
<a name="concept-xks-connectivity"></a>

外部密钥存储代理连接（“XKS 代理连接”）描述了 Amazon KMS 用于与外部密钥存储代理进行通信的方法。

您在创建外部密钥存储时指定代理连接选项，该选项将成为外部密钥存储的属性。您可以通过更新自定义密钥存储属性来更改代理连接选项，但必须确定外部密钥存储代理仍然可以访问相同的外部密钥。

Amazon KMS 支持以下连接选项。
+ [公共终端节点连接](choose-xks-connectivity.md#xks-connectivity-public-endpoint)-通过 Internet 将外部密钥存储代理的请求 Amazon KMS 发送到您控制的公共终端节点。此选项易于创建和维护，但可能无法满足每次安装的安全要求。
+ [VPC 终端节点服务连接](choose-xks-connectivity.md#xks-vpc-connectivity) — Amazon KMS 向您创建和维护的亚马逊虚拟私有云（亚马逊 VPC）终端节点服务发送请求。您可以在 Amazon VPC 内托管外部密钥存储代理，也可以将外部密钥存储代理托管在 Amazon VPC 之外 Amazon 并仅用于通信。此外还可以将外部密钥存储连接到由其他 Amazon Web Services 账户拥有的 Amazon VPC 端点服务。

有关外部密钥存储代理连接选项的详细信息，请参阅 [选择外部密钥存储代理连接选项](choose-xks-connectivity.md)。

### 外部密钥存储代理身份验证凭证
<a name="concept-xks-credential"></a>

要向外部密钥存储代理进行身份验证， Amazon KMS 请使用[签名 V4 (Sigv4) 身份验证凭据对外部密钥存储代理的所有请求进行签名](https://docs.amazonaws.cn/general/latest/gr/signature-version-4.html)。您在代理上建立并维护身份验证凭据，然后在创建外部存储 Amazon KMS 时提供此凭据。

**注意**  
 Amazon KMS 用于签署 XKS 代理请求的 Sigv4 凭据与您的中的委托人关联的任何 Sigv4 凭据无关。 Amazon Identity and Access Management Amazon Web Services 账户不要将任何 IAM SigV4 凭证重复用于外部密钥存储代理。

每个代理身份验证凭证有两个部分。在创建外部密钥存储或更新外部密钥存储的身份验证凭证时，必须提供这两部分。
+ 访问密钥 ID：标识秘密访问密钥。您能以明文形式提供此 ID。
+ 秘密访问密钥：凭证的秘密部分。 Amazon KMS 在存储凭据之前对凭据中的私有访问密钥进行加密。

您随时可以[编辑凭证设置](update-xks-keystore.md)，例如输入了错误值时、在代理上更改凭证时或者代理轮换证书时。有关对外部密钥存储代理 Amazon KMS 进行身份验证的技术细节，请参阅《 Amazon KMS 外部密钥存储代理 API 规范》中的[身份验证](https://github.com/aws/aws-kms-xksproxy-api-spec/blob/main/xks_proxy_api_spec.md#authentication)。

为了允许您在不中断外部密钥存储中使用 KMS 密钥的凭证的情况下轮换凭证，我们建议外部密钥存储代理至少支持两个有效的身份验证凭据。 Amazon Web Services 服务 Amazon KMS这样可以确保在您向 Amazon KMS提供新凭证时，以前的凭证继续有效。

为了帮助您跟踪代理身份验证凭证的使用年限， Amazon KMS 定义了 Amazon CloudWatch 指标。[XksProxyCredentialAge](monitoring-cloudwatch.md#metric-xks-proxy-credential-age)您可以使用此指标创建 CloudWatch 警报，当您的凭证期限达到您设定的阈值时，该警报会通知您。

### 代理 APIs
<a name="concept-proxy-apis"></a>

要支持 Amazon KMS 外部密钥存储，[外部密钥存储代理](#concept-xks-proxy)必须实现所需的代理， APIs 如[Amazon KMS 外部密钥存储代理 API 规范](https://github.com/aws/aws-kms-xksproxy-api-spec/)中所述。这些代理 API 请求是 Amazon KMS 发送到代理的唯一请求。即便您从不直接发送这些请求，了解这些请求也可能有助于您修复外部密钥存储或其代理可能出现的任何问题。例如，在其外部密钥存储的 [Amazon CloudWatch 指标](monitoring-cloudwatch.md)中 Amazon KMS 包含有关这些 API 调用的延迟和成功率的信息。有关更多信息，请参阅 [监控外部密钥存储](xks-monitoring.md)。

下表列出并描述了每个代理 APIs。它还包括触发对 Amazon KMS 代理 API 的调用的 Amazon KMS 操作以及与代理 API 相关的任何操作异常。


| 代理 API | 说明 | 相关 Amazon KMS 操作 | 
| --- | --- | --- | 
| Decrypt | Amazon KMS 发送要解密的密文以及要使用的[外部](#concept-external-key)密钥的 ID。所需的加密算法为 AES\$1GCM。 | [解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)，[ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html) | 
| Encrypt | Amazon KMS 发送要加密的数据以及要使用的[外部密钥](#concept-external-key)的 ID。所需的加密算法为 AES\$1GCM。 | [加密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html)、[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)、[GenerateDataKeyWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)、[ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html) | 
| GetHealthStatus | Amazon KMS 请求有关代理和您的外部密钥管理器状态的信息。每个外部密钥管理器的状态可以是以下状态之一。[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/kms/latest/developerguide/keystore-external.html) | [CreateCustomKeyStore](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateCustomKeyStore.html)（用于[公共终端节点连接](choose-xks-connectivity.md#xks-connectivity-public-endpoint)）、[ConnectCustomKeyStore](https://docs.amazonaws.cn/kms/latest/APIReference/API_ConnectCustomKeyStore.html)（用于 [VPC 终端节点服务连接](choose-xks-connectivity.md#xks-vpc-connectivity)）如果所有外部密钥管理器实例都处于 `Unavailable` 状态，则尝试创建或连接密钥存储将失败并显示 [`XksProxyUriUnreachableException`](xks-troubleshooting.md#fix-xks-latency)。 | 
| GetKeyMetadata | Amazon KMS 请求有关与您的[外部密钥](#concept-external-key)存储库中的 KMS 密钥关联的外部密钥的信息。响应内容包含密钥规范（`AES_256`）、密钥用法（`[ENCRYPT, DECRYPT]`），以及外部密钥处于 `ENABLED` 还是 `DISABLED` 状态。 | [CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)如果密钥规范不是 `AES_256`，或者密钥用法不是 `[ENCRYPT, DECRYPT]`，或者状态为 `DISABLED`，则 `CreateKey` 操作将失败并显示 `XksKeyInvalidConfigurationException`。 | 

### 双重加密
<a name="concept-double-encryption"></a>

由外部密钥存储中的 KMS 密钥加密的数据经过两次加密。首先， Amazon KMS 使用特定于 KMS Amazon KMS 密钥的密钥材料对数据进行加密。然后，[外部密钥管理器](#concept-ekm)使用[外部密钥](#concept-external-key)加密经过 Amazon KMS加密的加密文字。此过程称为*双重加密*。

双重加密可确保外部密钥存储中经 KMS 密钥加密的数据至少与经标准 KMS 密钥加密的加密文字一样强大。它还可以保护您从外部密钥存储代理传输 Amazon KMS 的纯文本。您可以借助双重加密保留对加密文字的完全控制。如果您通过外部代理永久撤消 Amazon 对外部密钥的访问权限， Amazon 中剩余的任何加密文字都会受到有效的加密粉碎处理。

![\[在外部密钥存储中对受 KMS 密钥保护的数据进行双重加密\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/xks-double-encrypt-40.png)


要启用双重加密，外部密钥存储中的每个 KMS 密钥都有*两个*加密备用密钥：
+ KMS Amazon KMS 密钥独有的密钥材料。此密钥材料是生成的，仅用于 Amazon KMS [FIPS 140-3 安全等级 3](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4884) 认证的硬件安全模块 ()。HSMs
+ 外部密钥管理器中的[外部密钥](#concept-external-key)。

双重加密具有以下效果：
+ Amazon KMS 如果不通过外部密钥存储代理访问您的外部密钥，则无法解密外部密钥存储库中由 KMS 密钥加密的任何密文。
+ 即使您有外部密钥材料，也无法解密外部密钥存储库中由 KMS 密钥加密的任何密文。 Amazon
+ 即使您拥有外部密钥材料，也无法重新创建已从外部密钥存储中删除的 KMS 密钥。每个 KMS 密钥都有包含在对称加密文字中的唯一元数据。新的 KMS 密钥将无法解密由原始密钥加密的加密文字，即使其使用相同的外部密钥材料也是如此。

有关实际应用中的双重加密示例，请参见 [外部密钥存储的工作原理](#xks-how-it-works)。

## 外部密钥存储的工作原理
<a name="xks-how-it-works"></a>

[外部密钥存储](#concept-external-key-store)、[外部密钥存储代理](#concept-xks-proxy)和[外部密钥管理器](#concept-ekm)会协同保护您的 Amazon 资源。以下过程描述了典型 Amazon Web Services 服务 的加密工作流程，即使用由 KMS 密钥保护的唯一数据密钥对每个对象进行加密。在本例中，您选择了外部密钥存储中的 KMS 密钥来保护对象。该示例说明了如何 Amazon KMS 使用[双重加密](#concept-double-encryption)来保护传输中的数据密钥，并确保由外部密钥存储库中的 KMS 密钥生成的密文始终至少与由标准对称 KMS 密钥加密并包含密钥材料的密文一样强大。 Amazon KMS

与之集成的每个实际 Amazon Web Services 服务 使用的加密方法各 Amazon KMS 不相同。有关详细信息，请参阅 Amazon Web Services 服务 文档“安全”章节中的“数据保护”主题。

![\[外部密钥存储的工作原理\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/xks-how-it-works-jan26.png)


1. 您向 Amazon Web Services 服务 资源中添加了一个新对象。要加密对象，请 Amazon KMS 使用外部密钥存储库中的 KMS 密钥 Amazon Web Services 服务 向发送[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)请求。

1. Amazon KMS 生成 256 位对称[数据密钥](data-keys.md)，并准备通过外部密钥存储代理将纯文本数据密钥的副本发送到外部密钥管理器。 Amazon KMS 使用与外部[密钥存储库中的 KMS 密钥关联的密钥[材料对纯文本数据Amazon KMS 密钥](#concept-double-encryption)进行加密，从而开始双重](#concept-double-encryption)加密过程。

1. Amazon KMS 向与外部密钥存储关联的外部密钥存储代理发送[加密](#concept-proxy-apis)请求。该请求包括要加密的数据密钥密文以及与 KMS [密钥关联的外部密钥](#concept-external-key)的 ID。 Amazon KMS 使用外部密钥存储[代理的代理身份验证凭据](#concept-xks-credential)对请求进行签名。

   数据密钥的明文副本不会发送到外部密钥存储代理。

1. 外部密钥存储代理对请求进行身份验证，然后将加密请求传递给您的外部密钥管理器。

   一些外部密钥存储代理还实现了可选的[授权策略](authorize-xks-key-store.md#xks-proxy-authorization)，该策略仅允许选定的主体在特定条件下执行操作。

1. 您的外部密钥管理器使用指定的外部密钥对数据密钥加密文字进行加密。外部密钥管理器将经过双重加密的数据密钥返回给外部密钥存储代理，后者再将其返回给 Amazon KMS。

1. Amazon KMS 将纯文本数据密钥和该数据密钥的双重加密副本返回到。 Amazon Web Services 服务

1.  Amazon Web Services 服务 使用纯文本数据密钥对资源对象进行加密，销毁纯文本数据密钥，并将加密的数据密钥与加密对象一起存储。

   有些人 Amazon Web Services 服务 可能会缓存纯文本数据密钥以用于多个对象，或者在使用资源时重复使用。有关更多信息，请参阅 [不可用的 KMS 密钥如何影响数据密钥](unusable-kms-keys.md)。

[要解密加密对象， Amazon Web Services 服务 必须在 Decrypt 请求 Amazon KMS 中将加密的数据密钥发回给。](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)要解密加密的数据密钥， Amazon KMS 必须使用外部密钥的 ID 将加密的数据密钥发送回您的外部密钥存储代理服务器。如果对外部密钥存储代理的解密请求因任何原因失败，则 Amazon KMS 无法解密加密的数据密钥， Amazon Web Services 服务 也无法解密加密对象。