API Gateway への IAM 認証で SIGv4 署名付きリクエストを行う際の署名不一致エラーのトラブルシューティング方法を教えてください。

所要時間2分
0

Amazon API Gateway への Signature Version 4 (SigV4) の署名付きリクエストが 403 レスポンスとエラーで失敗しました。エラーは次のようなものです。「The request signature we calculated does not match the signature you provided.Check your AWS Secret Access Key and signing method」(計算したリクエストの署名が、提供された署名と一致しません。AWS シークレットアクセスキーと署名方法を確認してください)。

簡単な説明

AWS Identity and Access Management (IAM) 認証を使用する API Gateway API エンドポイントは、次の場合に 403 エラーを返すことがあります。

  • API リクエストが署名されておらず、API リクエストが IAM 認証を使用する。
  • リクエストの署名に使用された IAM 認証情報が正しくないか、API を呼び出す許可がない。
  • 署名された API リクエストの署名が API Gateway API エンドポイントの署名と一致しない。
  • API リクエストヘッダーが正しくない。

解決方法

IAM 認証

IAM 認証を使用する API リクエストが SigV4 で署名されていることを確認してください。API リクエストが署名されていない場合、「Missing Authentication Token」(認証トークンがありません) というエラーが表示されることがあります。

IAM 認証情報

アクセスキーとシークレットキーの認証情報が正しいことを確認します。アクセスキーが正しくない場合、次のエラーが表示されることがあります。「The security token included in the request is invalid. (リクエストに含まれるセキュリティトークンが無効です。)」

リクエストの署名に使用される IAM エンティティに execute-api:Invoke 許可があることを確認してください。IAM エンティティに execute-api:Invoke 許可がない場合、次のエラーが表示されることがあります。「ユーザー: arn:aws:iam::xxxxxxxxxxxx:user/username に実行権限がありません: execute-api:Invoke on resource」

署名の不一致

シークレットアクセスキーが正しくない場合、次のエラーが表示されることがあります。「The request signature we calculated does not match the signature you provided. (計算されたリクエスト署名が、提供された署名と一致しません。)」

シークレットアクセスキーは、Credential パラメータのアクセスキー ID と一致する必要があります。手順については、「API Gateway REST APIの IAM 認証を有効化するにはどうすればいいですか?」の「認証設定をテストするリクエストを送信する」セクションを参照してください。

SIGv4 署名プロセスの指示に従っていることを確認してください。署名計算の値が正しくない場合、次のエラーが表示されることがあります。「The request signature we calculated does not match the signature you provided. (計算されたリクエスト署名が、指定した署名と一致しません。)」

API Gateway が署名付きリクエストを受け取ると、署名を再計算します。値に違いがある場合、API Gateway は別の署名を取得します。正規のリクエストと文字列を、エラーメッセージの値を使用して署名付きリクエストと比較します。相違がある場合は、署名プロセスを変更してください。

正規リクエストの例:

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 any 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 request                       
x-amz-date:20220806T024003Z                              

content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- hash of the payload

正規エラー応答の例:

<ErrorResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

The canonical string for this request should have been 'GET / Action=ListGroupsForUser&MaxItems=100&UserName=Test&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential
=AKIAIOSFODNN7EXAMPLE%2F20120223%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20120223T063000Z&X-Amz-SignedHeaders=host
host:iam.amazonaws.com

host
<hashed-value>'

The String-to-Sign should have been
'AWS4-HMAC-SHA256
20120223T063000Z
20120223/us-east-1/iam/aws4_request
<hashed-value>'
</Message>
  </Error>
  <RequestId>4ced6e96-5de8-11e1-aa78-a56908bdf8eb</RequestId>
</ErrorResponse>

注意:API ゲートウェイヘッダーの場合は、hostx-amz-date ヘッダーのみが必要です。

API リクエストヘッダー

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」(認証ヘッダーには 'Credential' パラメーターが必要です)。

SigV4 認証リクエストには、HTTP Date または x-amz-date ヘッダーのいずれかを使用してリクエスト日も含めるようにしてください。


関連情報

AWS SDK のコード例

API Gateway REST API から HTTP 403 エラーをトラブルシューティングする方法を教えてください。

コメントはありません

関連するコンテンツ