對已簽署的 AWS API 請求進行排疑解難 - AWS Identity and Access Management

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

對已簽署的 AWS API 請求進行排疑解難

重要

除非您使用 AWS SDK 或 CLI,否則您必須撰寫程式碼來計算在要求中提供驗證資訊的簽章。SigV4 簽章計算可能是一項複雜的工作,我們建議您儘可能使用 AWS SDK 或 CLI。

當您開發建立已簽署要求的程式碼時,您可能會收到SignatureDoesNotMatch來自 AWS 服務. 這些錯誤意味著 HTTP 請求中的簽名值與 AWS 服務 計算的簽名 AWS 不匹配。當許可不允許呼叫者發出請求時,將傳回 HTTP 401 Unauthorized 錯誤。

如有以下情形,API 請求可能傳回錯誤:

  • API 請求未簽署,且 API 請求使用 IAM 身分驗證。

  • 用於簽署請求的 IAM 憑證不正確或沒有調用 API 的許可。

  • 已簽署 API 要求的簽章與 AWS 服務計算的簽章不符。

  • API 請求標頭不正確。

注意

在探索其他錯誤解決方案之前,請將簽 AWS 名協議從 AWS 簽名版本 2(SigV2)更新為簽名版本 4(Sigv4)。服務 (例如 Amazon S3) 和區域不再支援 SigV2 簽署。

憑證錯誤

確保使用 SigV4 簽署 API 請求。如果 API 請求未簽署,則您有可能收到錯誤:Missing Authentication Token新增缺少的簽章並重新傳送請求。

驗證存取金鑰和私密金鑰的身分驗證憑證是正確的。如果存取金鑰錯誤,則您有可能收到錯誤:Unauthorized。確保用於簽署請求的實體有權發出請求。如需詳細資訊,請參閱 排查拒絕存取錯誤訊息問題

正式請求與簽署字串錯誤

如果您錯誤計算 步驟 2:建立正式請求雜湊步驟 3:建立登入字串 中正式請求,則該服務執行的簽章驗證步驟便會失敗,並顯示錯誤訊息:

The request signature we calculated does not match the signature you provided

當 AWS 服務收到已簽署的要求時,會重新計算簽章。如果值之間有差異,則簽名不匹配。使用錯誤訊息中的值,比對正式請求和字串以及您的已簽署請求。若有任何差異,請修改簽署程序。

注意

您也可以驗證您未透過可修改標頭或請求的代理傳送請求。

範例 正式請求範例
GET -------- HTTP method / -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path} -------- Query string key-value pair. Leave it blank if the request doesn't have a query string. content-type:application/json -------- Header key-value pair. One header per line. host:0123456789.execute-api.us-east-1.amazonaws.com -------- Host and x-amz-date are required headers for all signed requests. x-amz-date:20220806T024003Z content-type;host;x-amz-date -------- A list of signed headers d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501 -------- Hash of the payload

要驗證私密金鑰是否與存取金鑰 ID 相符,可以使用已知有效的實作來測試它們。例如,使用 AWS SDK 或 AWS CLI 向 AWS.

API 請求標頭

請確保您在 步驟 4:計算簽章 中新增的 SigV4 授權標頭包含與下列金鑰類似的正確憑證金鑰:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature

如果憑證金鑰缺失或錯誤,您有可能收到錯誤:Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter.。確保 SigV4 授權請求還包含使用 HTTP Datex-amz-date 標頭的請求日期。

憑證範圍錯誤

您在 步驟 3:建立登入字串 中建立的憑證範圍會將簽章限制在特定日期、區域和服務。此字串的格式如下所示:

YYYYMMDD/region/service/aws4_request
注意

如果您使用的是 SigV4a,區域不包含在憑證範圍之中。

日期

如果憑證範圍未指定與 x-amz-date 標頭相同的日期,則簽名驗證步驟會失敗,並顯示下列錯誤訊息:

Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP

如果請求指定未來的時間,則簽章驗證步驟會失敗,並顯示下列錯誤訊息:

Signature not yet current: date is still later than date

如果請求已過期,簽章驗證步驟會失敗,並顯示下列錯誤訊息:

Signature expired: date is now earlier than date
區域

如果憑證範圍未指定與請求相同的區域,則簽名驗證步驟會失敗,並顯示下列錯誤訊息:

Credential should be scoped to a valid Region, not region-code
服務

如果憑證範圍未指定與 host 標頭相同的服務,則簽名驗證步驟會失敗,並顯示下列錯誤訊息:

Credential should be scoped to correct service: 'service'
終止字串

如果憑證範圍沒有以 aws4_request 結尾,則簽名驗證步驟會失敗,並顯示下列錯誤訊息:

Credential should be scoped with a valid terminator: 'aws4_request'

金鑰簽署錯誤

簽署金鑰衍生不正確或不當使用密碼編譯而造成的錯誤,較難進行故障診斷。確認正式字串和登入字串正確無誤之後,您也可以檢查下列其中一個問題:

  • 私密存取金鑰與您指定的存取金鑰 ID 不符。

  • 您的金鑰衍生程式碼發生問題。

要驗證私密金鑰是否與存取金鑰 ID 相符,可以使用已知有效的實作來測試它們。例如,使用 AWS SDK 或向 AWS。 AWS CLI 如需取得範例,請參閱「請求簽章範例」。