我想使用 AWS 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 密钥对的签名格式,请参阅用于签名和验证的 RSA 密钥规范。
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
对本地文件进行签名
在您的 AWS 账户中创建 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 操作系统 (OS) 的 base64 文件:
certutil -decode C:\Temp\sign.b64 C:\Temp\sign.bin
您现在可以共享 sign.b64 签名文件。
验证 AWS KMS 签名
要验证签名文件,您必须拥有公有密钥。要获取公有密钥,请运行 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
运行以下命令以将 base64 文件转换为名为 KMSPublic.key 的 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.txtVerified OK
当输出显示“Verified OK”时,表明验证成功。
如果您没有收到验证回复,请检查以下内容:
- OpenSSL 签名算法与用于对文件进行签名的签名算法相同。
- 您的文件并非 base64 编码。
相关信息
加密基元
AWS KMS 概念