如何验证由 AWS KMS 非对称密钥生成的签名?

2 分钟阅读
0

我想使用 Key Management Service (AWS KMS) 对文件进行签名。然后,我想共享文件、其签名和公有密钥以验证签名是否有效。我不想为用户提供访问我的 AWS KMS 密钥的 API 访问权限。

解决方案

以下示例使用带有 ECC_NIST_P256 (secp256r1) 非对称密钥对的 AWS KMS。当 AWS KMS 使用此密钥对生成签名文件时,该文件是根据 NIST FIPS 168-4 创建的。按照 ANS X9.62 中的规定生成包含 (r, s) 值的 ECDSA 数字签名。由于采用开放标准,可以使用 OpenSSL 验证此签名。

要获取 RSA 密钥对的签名格式,请按照创建和管理 AWS KMS 密钥的说明进行操作。

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

使用 AWS KMS 对本地文件签名

在您的账户中创建 AWS KMS 密钥对后,参阅使用 AWS CLI的密钥对签名文件。从 AWS KMS API 收到的响应以 Base64 编码。以下示例使用 --query参数从响应中获取签名值,并将其放在 sign.b64 文件中。

[ec2-user@ip-172-31-23-22 ~]$ aws kms sign --key-id arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab --message fileb://message.txt --signing-algorithm ECDSA_SHA_256 --query 'Signature' --output text > sign.b64

**注意:**您最多可以提交 4096 字节的消息。要对较大的消息进行签名,请生成该消息的哈希摘要。然后,在消息参数中提供哈希摘要。要指示消息是完整消息还是摘要,请使用 MessageType 参数。请务必注意签名算法,因为这是稍后验证签名所必需的内容。

由于签名采用 Base64 格式,因此您可以使用 Linux base64 编码命令将其转换为二进制格式,如下所示:

[ec2-user@ip-172-31-23-22 ~]$ base64 -d sign.b64 > sign.bin

要解码适用于 Windows 操作系统的 Base64 文件,请运行以下命令:

certutil -decode C:\Temp\sign.b64 C:\Temp\sign.bin

使用 OpenSSL 验证 AWS KMS 签名

您现在可以共享 sign.b64 签名文件。要验证签名文件,您必须拥有公有密钥。要获取公有密钥,请运行 AWS CLI 命令 get-public-key,如下所示:

[ec2-user@ip-172-31-23-22 ~]$ aws kms get-public-key --key-id arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab --output text --query 'PublicKey' > KMSPublic.b64

要使用另一个名为 KMSPublic.key 的文件将 base64 文件转换为 DER 编码,请运行以下命令:

[ec2-user@ip-172-31-23-22 ~]$ base64 -d KMSPublic.b64 > KMSPublic.key

现在,您可以通过 message.txt 文件获得二进制格式的公有密钥和签名。要验证签名,请运行 OpenSSL 命令 dgst,如下所示:

[ec2-user@ip-172-31-23-22 ~]$ openssl dgst -sha256 -verify KMSPublic.key -keyform DER -signature sign.bin message.txt
Verified OK

此示例的“Verified OK”输出表明验证成功。

如果您没有收到验证回复,请确保:

  • OpenSSL 签名算法与用于对文件进行签名的算法相同。
  • 您的文件并非 Base64 编码。

相关信息

加密原语

AWS KMS 概念

AWS 官方
AWS 官方已更新 2 年前