跳至內容

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

2 分的閱讀內容
0

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

解決方法

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

若要取得 RSA 金鑰對的簽章格式,請參閱用於簽署與驗證的 RSA 金鑰規格

**注意:**如果您在執行 AWS Command Line Interface (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 B 的訊息。若要簽署較大的訊息,請產生訊息的雜湊摘要。然後,在訊息參數中提供雜湊摘要。若要顯示訊息是完整訊息還是摘要,請使用 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 簽章

若要驗證簽章檔案,您必須擁有公有金鑰。若要取得公有金鑰,請執行 get-public-key AWS CLI 命令:

[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 檔案獲得了二進位格式的公有金鑰和簽章。

若要驗證簽章,請執行 dgst OpenSSL 命令:

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

當輸出顯示「驗證成功」時,代表驗證成功。

如果您沒有收到驗證回應,請檢查以下事項:

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

相關資訊

密碼原語

AWS KMS 概念

AWS 官方已更新 1 年前