将混合后量子 TLS 与 AWS KMS 结合使用 - AWS Key Management Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

将混合后量子 TLS 与 AWS KMS 结合使用

AWS Key Management Service (AWS KMS) 现在支持对传输层安全 (TLS) 网络加密协议使用混合后量子密钥交换选项。当您连接到 KMS API 终端节点时,可以使用此 TLS 选项。我们在标准化后量子算法之前提供了此功能,因此您可以开始测试这些密钥交换协议对 AWS KMS 调用产生的影响。这些混合后量子密钥交换功能是可选的,至少与我们目前使用的 TLS 加密一样安全,并且有可能会提供额外的安全优势。不过,与目前使用的传统密钥交换协议相比,它们会影响延迟和吞吐量性能。

您发送到 AWS Key Management Service (AWS KMS) 的数据,在传输过程中由传输层安全 (TLS) 连接提供的加密机制进行保护。借助 AWS KMS 支持对 TLS 会话使用的传统密码套件,使得对密钥交换机制进行的暴力攻击在现有技术下是不可行的。不过,如果大规模量子计算在未来得到广泛应用,那么 TLS 密钥交换机制中使用的传统密码套件将会容易受到这些攻击。如果您正在开发的应用程序依赖于通过 TLS 连接传输的数据的长期保密性,则应考虑在大规模量子计算机投入使用之前,采用迁移到后量子密码加密技术的计划。AWS 正在努力针对这个远景做好准备,我们希望您也能做好充分的准备。

为了保护今天加密的数据,让这些数据在未来免受可能的攻击,AWS 正在积极参与密码社区,一起开发抗量子密码算法或后量子算法。我们已经在 AWS KMS 终端节点中实施了混合后量子密钥交换密码套件。这些混合密码套件将传统加密算法与后量子算法相结合,可确保 TLS 连接至少与传统密码套件一样强大。

这些混合密码套件可以在大多数 AWS 区域中用于您的生产工作负载。不过,由于混合密码套件的性能特征及带宽要求与传统密钥交换机制的性能特征及带宽要求有所不同,我们建议您在不同条件下针对 AWS KMS API 调用开展测试

反馈

与以前一样,我们希望您能够提供反馈并参与我们的开源存储库。我们尤其希望了解您的基础设施如何与新形式的 TLS 流量进行交互。

  • 要提供有关本主题的反馈,请使用此页面右下角的反馈链接。您也可以 创建问题 或者 AWS-KMS-Developer-docs Github中的存储库。

  • 我们正在 GitHub 上的 s2n 存储库中,以开源项目形式开发这些混合密码套件。要提供有关密码套件可用性方面的反馈,或者共享全新的测试条件或结果,请在 s2n 存储库中创建一个问题

  • 我们正在编写代码示例,以便在 aws-kms-pq-tls-example GitHub 存储库中将混合后量子 TLS 与 AWS KMS 结合使用。要询问有关配置 HTTP 客户端或 AWS KMS 客户端以使用混合密码套件的问题或分享相关的理念,请在 aws-kms-pq-tls-example 存储库中创建一个问题

支持的 AWS 区域

AWS KMS 的后量子 TLS 在几乎所有 AWS 区域中都可用,但 AWS GovCloud(美国东部)、AWS GovCloud(美国西部)、中国(北京) 和 中国 (宁夏) 除外。

有关 AWS 区域的 AWS KMS 终端节点的列表,请参阅 Amazon Web Services 一般参考 中的 AWS Key Management Service 终端节点和配额。有关 FIPS 终端节点的信息,请参阅 Amazon Web Services 一般参考 中的 AWS 服务终端节点。.

关于 TLS 中的混合后量子密钥交换

AWS KMS 支持混合后量子密钥交换密码套件。您可以使用 适用于 Java 的 AWS 开发工具包 2.x 和 AWS 公共运行时配置 HTTP 客户端,以便使用这些密码套件。然后,无论您何时使用 HTTP 客户端连接到 AWS KMS 终端节点,都会使用混合密码套件。

该 HTTP 客户端使用 s2n,后者是一种 TLS 协议开源实施。s2n 包含 pq-crypto 模块,其中包含用于传输中加密的混合后量子算法的实施。

实施的 s2n 中的混合密码套件只能用于密钥交换,而不能用于直接数据加密。在密钥交换过程中,客户端和服务器会计算将用于加密和解密传输中的数据的密钥。

S2N使用的算法是 混合 结合了 椭圆曲线Diffie-Hellman (ECDH),今天在TLS中使用的经典密钥交换算法, 钻头翻转密钥封装 (自行车),一个提议的Quantum算法。此机制单独使用每个算法来生成密钥。然后,以加密方式结合使用这两个密钥。使用 s2n,您可以配置一个 HTTP 客户端,并设置密码优先顺序,将 ECDH 与 BIKE 放在优先列表中。传统密钥交换算法包含在优先列表中以确保兼容性,但它们的优先顺序较低。

虽然正在进行的研究表明 BIKE 算法缺乏预期的后量子密码强度,混合密钥仍然至少与目前使用的单个 ECDH 密钥一样强大。美国国家标准和技术研究所 (NIST) 尚未标准化后量子算法。他们仍在评估各种候选方法。在评估过程完成之前,我们建议使用混合算法,而不是单独使用后量子算法。

将混合后量子 TLS 与 AWS KMS 结合使用

您可以对 AWS KMS 调用使用混合后量子 TLS。在设置 HTTP 客户端测试环境时,请注意以下信息:

传输中加密

s2n 中的混合密码套件仅用于传输中加密。他们在您的客户旅行时保护您的数据 AWS KMS 端点。 AWS KMS 不使用这些密码套件来加密数据 客户主密钥 (CMKs)。

相反,当 AWS KMS 在 CMKs,它使用了256位密钥的对称密码和在Galois计数器模式(AES-GCM)算法中的高级加密标准,该算法已经是可量化的。理论上,在未来针对使用 256 位 AES-GCM 密钥创建的密文的大规模量子计算攻击中,密钥的有效安全性将会降至 128 位。此安全级别足以对抗对 AWS KMS 密文进行的暴力破解攻击。

支持的系统

目前,仅在 Linux 系统上支持使用 s2n 中的混合密码套件。此外,这些密码套件仅在支持 AWS 公共运行时的开发工具包中支持,例如 适用于 Java 的 AWS 开发工具包 2.x。有关示例,请参阅如何配置混合后量子 TLS

AWS KMS 终端节点

在使用混合密码套件时,请使用标准 AWS KMS 终端节点。s2n 中的混合密码套件与适用于 AWS KMS 的 FIPS 140-2 验证的终端节点不兼容。在经过验证的加密模块中不允许使用后量子算法。

在 HTTP 客户端中配置 s2n 中的混合后量子密码优先顺序时,后量子密码在密码优先列表中处于第一位。但是,在优先列表中,传统非混合密码处于较低的优先顺序,以便实现兼容性。如果您将此密码优先顺序与 AWS KMS FIPS 140-2 验证的终端节点结合使用,s2n 将协商使用一个传统的非混合密钥交换密码。

有关 AWS 区域的 AWS KMS 终端节点的列表,请参阅 Amazon Web Services 一般参考 中的 AWS Key Management Service 终端节点和配额。有关 FIPS 终端节点的信息,请参阅 Amazon Web Services 一般参考 中的 AWS 服务终端节点

预期性能

我们在早期开展的基准测试表明,s2n 中的混合密码套件比传统 TLS 密码套件的速度要慢。根据网络配置文件、CPU 速度、内核数量和调度速率的不同,效果也不尽相同。有关性能测试的结果,请参阅Post-quantum TLS now supported in AWS KMS

如何配置混合后量子 TLS

在此过程中,您可以从 GitHub 存储库中获取 适用于 Java 的 AWS 开发工具包 2.xaws-crt-dev-preview(开发人员预览版)分支。接下来,您可以构建 AWS 公共运行时客户端并将 AWS 公共运行时添加到依赖项中。然后,可以配置使用混合量子后密码优先顺序的 HTTP 客户端,并创建使用 HTTP 客户端的 AWS KMS 客户端。

要查看演示混合后量子 TLS 与 AWS KMS 结合使用的配置过程以及具体使用方法的完整工作示例,请参阅 aws-kms-pq-tls-example 存储库。

  1. 克隆 适用于 Java 的 AWS 开发工具包 2.x 的开发人员预览版分支 (aws-crt-dev-preview)。

    适用于 Java 的 AWS 开发工具包 2.x 正在 aws-sdk-java-v2 GitHub 存储库中进行开发。

    注意

    aws-crt-dev-preview 分支是一个 Beta 版本。您在使用此库时,需遵循 AWS 服务条款第 1.10 节(“Beta 服务参与”)中的规定。

    $ git clone git@github.com:aws/aws-sdk-java-v2.git --branch aws-crt-dev-preview
  2. 安装并构建 AWS 公共运行时客户端 (aws-crt-client) JAR。

    $ cd aws-sdk-java-v2 $ mvn install -Pquick
  3. 将 AWS 公共运行时客户端添加到您的 Maven 依赖项中。我们建议您使用最新可用版本。

    例如,以下语句将 AWS 公共运行时客户端的版本 2.10.7-SNAPSHOT 添加到您的 Maven 依赖项中。

    <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> <version>2.10.7-SNAPSHOT</version> </dependency>
  4. 要启用混合后量子密码套件,请将 适用于 Java 的 AWS 开发工具包 2.x 添加到您的项目中并进行初始化。然后,按照以下示例所示,启用混合密码套件。

    此代码可以确保您正在使用支持混合密码套件的系统。然后,代码会创建一个 HTTP 客户端,并且在 TLS_CIPHER_KMS_PQ_TLSv1_0_2019_06 密码优先顺序中,将 ECDH 与 BIKE 结合使用的混合密码套件设置为优先使用。最后,它创建一个 AWS KMS 客户端,该客户端使用 HTTP 客户端进行数据传输。

    此代码使用 AWS KMS 异步客户端 KmsAsyncClient,该客户端对 AWS KMS 执行异步调用。有关此客户端的信息,请参阅 KmsAsyncClient Javadoc

    在此代码完成后,AWS KMS 异步客户端上您的 AWS KMS API 请求将对 TLS 使用混合密码套件。

    // Check platform support if(!TLS_CIPHER_KMS_PQ_TLSv1_0_2019_06.isSupported()){ throw new RuntimeException("Hybrid post-quantum cipher suites are not supported on this platform"); } // Configure HTTP client SdkAsyncHttpClient awsCrtHttpClient = AwsCrtAsyncHttpClient.builder() .tlsCipherPreference(TLS_CIPHER_KMS_PQ_TLSv1_0_2019_06) .build(); // Create the KMS async client KmsAsyncClient kmsAsync = KmsAsyncClient.builder() .httpClient(awsCrtHttpClient) .build();
  5. 针对您的 KMS 调用测试后量子 TLS。

    在配置的 AWS KMS 客户端上调用 AWS KMS API 操作时,会使用混合后量子 TLS 将您的调用传输到 AWS KMS 终端节点。要测试您的配置,请运行简单 KMS API 调用,例如 ListKeys

    ListKeysReponse keys = kmsAsync.listKeys().get();

针对 AWS KMS 测试混合后量子 TLS

请考虑在调用 AWS KMS 的应用程序上,使用混合密码套件运行下面的测试。

  • 运行负载测试和基准测试。混合密码套件的执行方式与传统密钥交换算法有所不同。您可能需要调整连接超时,以便增加握手时间。如果您在 AWS Lambda 函数内部运行,请增大执行超时设置。

  • 请尝试从不同位置进行连接。根据您的请求采用的网络路径,您可能会发现中间主机、代理或带有深度数据包检查 (DPI) 功能的防火墙阻止了请求。这可能是因为在 TLS 握手的 ClientHello 部分中使用了新的密码套件,或者密钥交换消息比较大。如果您在解决这些问题时遇到麻烦,请与安全团队或 IT 管理员一起,更新相关配置并取消阻止新的 TLS 密码套件。

了解有关 AWS KMS 中的后量子 TLS 的更多信息

有关在 AWS KMS 中使用混合后量子 TLS 的更多信息,请参阅以下资源。