如何驗證 AWS KMS 非對稱金鑰產生的簽章?

上次更新日期:2022 年 8 月 4 日

我想要使用 Key Management Service (AWS KMS) 來簽署檔案。然後,我想共享檔案、其簽章和公開金鑰,以驗證簽章是否有效。我不想提供 API 存取權讓使用者存取我的 AWS KMS key。

解析度

下列範例將搭配使用 AWS KMS 與 ECC_NIST_P256 (secp256r1) 非對稱金鑰對。當 AWS KMS 使用此金鑰對產生簽章檔案時,會根據 NIST FIPS 168-4 建立簽章檔案。根據 ANS X9.62,會產生包含 (rs) 值的 ECDSA 數位簽章。由於採用開放標準,您可以使用 OpenSSL 驗證此簽章。

若要取得 RSA 金鑰對的簽章格式,請依照指示建立和管理 AWS KMS key

注意:如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本

使用 AWS KMS 簽署本機檔案

在您的帳戶中建立 AWS KMS key 之後,請參閱使用 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

此範例輸出「已驗證確定」表示驗證成功。

如果您沒有收到驗證回應,請確定:

  • OpenSSL 簽章演算法與用來簽署檔案的演算法相同。
  • 您的檔案不是 Base64 編碼。

此文章是否有幫助?


您是否需要帳單或技術支援?