宣布 AWS KMS 支持椭圆曲线迪菲

2026-01-27 14:00:05

AWS KMS 支持椭圆曲线 DiffieHellman (ECDH)

作者 Patrick Palmer Michael Miller Raj Puttaiah发布日期 2024年8月19日分类 高级、公告、AWS 密钥管理服务、安全、身份与合规永久链接

重要要点

AWS KMS 现已支持椭圆曲线 DiffieHellman (ECDH) 密钥协商,用户可以通过新的 DeriveSharedSecret API 行动建立安全通信通道。此 API 使得交换公钥的两方能够在不传递秘钥的情况下共享一个派生的秘钥。本文提供了如何使用 AWS KMS 和 OpenSSL 进行密钥派生的示例。

在使用加密技术保护数据时,协议设计者通常倾向于使用对称密钥及算法,因为它们速度快,效率高。然而,当数据在不可信的网络如互联网之间传输时,确保只有交换方可以知道相同密钥变得困难。非对称密钥对和算法通过允许在不可信的网络上共享公钥来解决这一问题。通过使用密钥协商方案,两个方可以利用彼此的公钥和各自的私钥来导出相同的共享秘密。

我们很高兴地宣布,AWS 密钥管理服务(AWS KMS) 现在支持 椭圆曲线 DiffieHellman (ECDH) 密钥协商。您可以使用新的 DeriveSharedSecret API 行动,使两方通过推导的共享秘密建立一个安全的通信通道。

在本文中,我们将提供对新 API 行动的概述,并解释如何通过仅交换公钥来建立安全的通信。接着我们将展示如何利用 AWS KMS 和 OpenSSL 进行共享秘密的导出示例命令。

通过此 DeriveSharedSecret API 行动,客户可以利用外部方的公钥,结合存储于 AWS KMS 的私钥,导出一个共享秘密。该共享秘密可用于通过密钥派生函数 (KDF) 来导出对称加密密钥。客户随后可以在其应用中使用此对称加密密钥来加密数据。

同样,外部方也可以将自己的相关私钥与客户在 AWS KMS 中的对应公钥结合,导出相同的共享秘密。

现在,双方都拥有相同的共享秘密,可以生成对称加密密钥,用于加密和解密他们之间交换的数据。

DeriveSharedSecret 为客户提供了一种简单且安全的方式,以在其应用中使用其私钥,开启基于 AWS KMS 保护的密钥的新的非对称加密使用案例,例如椭圆曲线集成加密方案 (ECIES) 或端到端加密 (E2EE) 方案。

AWS KMS DeriveSharedSecret 概述

AWS KMS API 文档 对 DeriveSharedSecret API 行动进行了更为详细的描述。在此,我们简要介绍与该 API 行动的交互方式,使用以下步骤:

创建一个椭圆曲线 (ECC) KMS 密钥,选择该密钥用于 KEYAGREEMENT 并选择支持的密钥规格之一。您无法将已有的 ECC 密钥修改为用于密钥协商。让其他方创建与您为 KMS 密钥定义的密钥规格匹配的椭圆曲线密钥。使用现有的 GetPublicKey API 行动检索与您的 KMS 密钥关联的公钥。通过值得信赖的方式与其他方交换公钥。请注意,DeriveSharedSecret 期望接收一个 base64 编码的 DER 格式公钥。使用对方的公钥作为输入,结合您指定的 KEYAGREEMENT 密钥。启动时,AWS KMS 仅支持 ECDH 密钥协商算法。另一方应使用从 AWS KMS 检索的公钥及其生成的 ECC 密钥对的私钥来导出共享秘密。

通过以上步骤,双方无需交换密钥信息即可获得相同的输出。仅交换了公钥。DeriveSharedSecret 的输出是原始共享秘密。该共享秘密是椭圆曲线上的点乘积,可能会产生超过加密密钥所需字节数的结果。我们建议客户使用 KDF,遵循 国家标准与技术研究所 (NIST) SP80056A Rev 3 第 58 节 的指导,来从这个共享秘密导出加密密钥。

为了说明这个过程,我们将使用 AWS CLI 和 OpenSSL 命令行进行步骤演示。AWS 已在 AWS 加密 SDK 中整合了客户的最佳实践。详情请访问 AWS KMS ECDH 密钥环。

示例用例

一个值得使用 ECDH 密钥协商的示例用例是端到端加密。尽管存在提供安全通信框架的协议例如,在 AWS Wickr 中,我们将突出一些这些协议的简化高层步骤。在我们的示例用例中,Alice 和 Bob 都是消息网络的一部分。此网络由一个集中式服务管理,该服务无权访问 Alice 或 Bob 的未加密消息。

如图所示,Alice 和 Bob 各自拥有一个 ECC 密钥对,通过 ECDH 参与秘密派生过程,经过以下步骤:

Alice 在集中式密钥存储服务中注册她的公钥。有关密钥存储服务的详细讨论超出本文范围。Bob,作为 AWS KMS 用户,调用 AWS KMS GetPublicKey 操作以获取 ECC KMS 密钥对的公钥。Bob 在同一集中式密钥存储服务中注册他的公钥。希望与 Bob 交换加密消息的 Alice,从集中式密钥存储服务中检索 Bob 的公钥。Bob 接到 Alice 想与他通信的通知,并从集中式密钥存储服务中检索 Alice 的公钥。使用 Bob 的公钥和她的私钥,Alice 通过其加密提供者导出共享秘密。使用 Alice 的公钥和他的私钥,Bob 通过 DeriveSharedSecret 导出共享秘密。Alice 和 Bob 现在拥有相同的共享秘密。Alice 可以使用适当的 KDF 从这个共享秘密创建对称加密密钥。此对称加密密钥可用于生成可以发送给 Bob 的密文。

示例用例逐步演示

您可以通过以下步骤创建 KMS 密钥以进行 ECDH 使用,并使用 AWS KMS 导出共享秘密。在演示过程中,示例用例中的用户 Alice 使用 OpenSSL 作为加密工具。我们将展示 AWS KMS 用户 Bob 和 OpenSSL 用户 Alice 如何通过各自的公钥导出共享秘密。

一般先决条件

您必须具备以下先决条件以实施解决方案:

AWS CLI 推荐使用最新版本。此示例使用 awscli/21540 和 awscli/132110。OpenSSL 此示例使用 OpenSSL 330。参与方示例用例中的 Alice 和 Bob各自拥有一个在同一曲线上的 ECC 密钥。接下来的部分 密钥创建先决条件 将解释如何创建这些密钥。密钥创建先决条件

Alice 和 Bob 在创建密钥时必须使用相同的 ECC 曲线。DeriveSharedSecret API 行动支持的曲线包括 ECCNISTP256、ECCNISTP384 和 ECCNISTP521,它们分别在 OpenSSL 中映射为 P256、P384 和 P521。AWS KMS 所支持的曲线为美国国家标准与技术研究所 (NIST) 批准的曲线。此外,AWS KMS 仅在亚马逊网络服务中国区域支持 SM2 密钥规格。

Bob 创建一个用于密钥协商目的的非对称 KMS 密钥

Bob 使用 CreateKey API 操作在 AWS KMS 中生成一个密钥对。在以下示例中,Bob 为 KeySpec 参数创建了一个 ECCNISTP256 的 ECC 密钥对,并为 KeyUsage 参数选择了 KEYAGREEMENT。

aws kms createkey keyspec ECCNISTP256 keyusage KEYAGREEMENT description 示例 ECDH 密钥对

返回的响应类似于以下内容:

json{ KeyMetadata { AWSAccountId 111122223333 KeyId a1b2c3d4567890abcdefEXAMPLE11111 Arn arnawskmsuseast1111122223333key/a1b2c3d4567890abcdefEXAMPLE11111 CreationDate 20240625T1306248880000700 Enabled true Description 示例 ECDH 密钥对 KeyUsage KEYAGREEMENT KeyState Enabled Origin AWSKMS KeyManager CUSTOMER CustomerMasterKeySpec ECCNISTP256 KeySpec ECCNISTP256 KeyAgreementAlgorithms [ ECDH ] MultiRegion false }}

您可以按照 创建非对称 KMS 密钥 文档查看如何使用 AWS 管理控制台 创建具有相同属性的 KMS 密钥。该示例创建的 KMS 密钥具有默认的 KMS 密钥策略。请根据最小权限原则适当审查并配置您的密钥策略。

注意: 当创建 KMS 密钥时,它将被 AWS CloudTrail 记录,这是一项用于监控和记录您账户活动的服务。对 AWS KMS 服务的 API 调用将被 记录在 CloudTrail 中,您可以使用这些记录来审核对 KMS 密钥的访问。

为了允许通过可读字符串识别您的 KMS 密钥,而不是通过 KeyId 值,您可以为 KMS 密钥 创建别名将 targetkeyid 值 a1b2c3d4567890abcdefEXAMPLE11111 替换为您的 KeyId 值。这将使您更容易使用和管理 KMS 密钥。

Bob 使用 CLI 创建 KMS 密钥的别名,命令如下:

aws kms createalias aliasname alias/exampleecdhkey targetkeyid a1b2c3d4567890abcdefEXAMPLE11111

Alice 使用 OpenSSL 创建用于密钥协商目的的 ECC 密钥

使用 OpenSSL 的 ecparam 和 genkey 选项,Alice 创建一个 P256 ECC 密钥。P256 曲线在 AWS KMS 中表示为 ECCNISTP256。

注意: 为了使 ECDH 能够正常工作,OpenSSL ECC 密钥的曲线必须与对方创建的 ECC KMS 密钥相同。

openssl ecparam name P256 genkey out openssleccprivatekeypem

免费加速器使用一小时

密钥交换和秘密派生过程

以下部分概述了 Alice 和 Bob 将遵循的步骤,以共享他们的公钥、检索彼此的公钥,然后使用 AWS KMS 和 OpenSSL 导出相同的共享秘密。Alice 和 Bob 分别导出的共享秘密将进行比较,以证明他们都导出了相同的共享秘密。

步骤 1 Alice 生成并注册她的 OpenSSL 公钥到中央服务

AWS KMS 期望公钥为 DER 格式。因此,在这个示例中,Alice 使用她的 ECC 私钥创建一个 DER 格式的公钥。Alice 运行以下命令生成一个包含其公钥的 DER 格式文件:

openssl ec in openssleccprivatekeypem pubout outform DER gt openssleccpublickeybinder

文件 openssleccpublickeybinder 将包含 DER 格式的公钥,Alice 可以将其存储在集中式密钥存储服务中或发送给她希望与之通信的任何人。有关集中式密钥存储服务的细节超出本文范围。

步骤 2 Bob 获取其 ECC KMS 密钥的公钥

为了检索其 ECC KMS 密钥的公钥副本,Bob 使用 GetPublicKey API 行动。Bob 使用 AWS CLI 命令 getpublickey 调用此 API,如下所示:

aws kms getpublickey keyid alias/exampleecdhkey output text query PublicKey base64 decode gt kmsecdhpublickeyder

返回的 PublicKey 值是一个 DER 编码的 X509 公钥。由于使用 AWS CLI,公钥输出以 base64 编码的形式返回以便于阅读。使用 base64 命令对该值解码,并将解码后的值存储在输出文件中。文件 kmsecdhpublickeyder 包含 DER 编码的公钥。

注意: 如果您通过使用 Amazon 的 SDK例如 Boto3调用此 API,则返回的 PublicKey 值不会经过 base64 编码。

在我们的示例用例中,Alice 使用 OpenSSL,并期望以 PEM 格式接收公钥。Bob 将其 DER 格式的公钥转换为 PEM 格式,命令如下:

openssl ec pubin inform DER outform PEM in kmsecdhpublickeyder out kmsecdhpublickeypem

宣布 AWS KMS 支持椭圆曲线迪菲

文件 kmsecdhpublickeypem 包含 PEM 格式的公钥。

步骤 3 Bob 在集中式密钥存储服务中注册他的公钥

Bob 将在步骤 2 中以 PEM 格式获得的公钥保存到集中式密钥存储服务中。

步骤 4 Alice 检索 Bob 的公钥以导出共享秘密

为了执行 ECDH 密钥协商,Alice 和 Bob 需要互相交换公钥。想要向 Bob 发送加密消息的 Alice 从集中式密钥存储服务中检索 Bob 的公钥。

Bob 的公钥 kmsecdhpublickeypem 已以 PEM 格式存在,如 OpenSSL 所期待的。

步骤 5 Bob 检索 Alice 的公钥以导出共享秘密

为了执行 ECDH 密钥协商,Alice 和 Bob 需要互相交换公钥。Bob 收到通知,得知 Alice 希望与他通信,并从集中式密钥存储服务中检索 Alice 的公钥。

Alice 的公钥 openssleccpublickeybinder 已以 DER 格式存在,这是 AWS KMS 所期望的。

步骤 6 Alice 使用 OpenSSL 导出共享秘密

Alice 使用她的私钥和 Bob 的公钥,可以通过 OpenSSL 导出共享秘密。Alice 使用 OpenSSL 的 pkeyutl 命令与 derive 选项,如下所示:

openssl pkeyutl derive inkey openssleccprivatekeypem peerkey kmsecdhpublickeypem gt opensslss

最新文章