AWS API の署名済みリクエストのトラブルシューティング - AWS Identity and Access Management

AWS API の署名済みリクエストのトラブルシューティング

重要

AWS SDK または CLI を使用していない限り、リクエストの認証情報を提供する署名を計算するコードを記述する必要があります。SigV4 での署名計算は複雑な作業になる場合があるため、可能な限り AWS SDK または CLI を使用することをお勧めします。

署名リクエストを作成するコードを開発する際に、AWS のサービス が HTTP 403 SignatureDoesNotMatch エラーを表示する場合があります。これらのエラーは、AWS に対する HTTP リクエストの署名値が、AWS のサービス が計算した署名と一致しなかったことを意味します。HTTP 401 Unauthorized エラーは、アクセス許可によって呼び出し元がリクエストを行うことを許可されていない場合に返されます。

API リクエストは次の場合にエラーを返す可能性があります。

  • API リクエストは署名されておらず、API リクエストは IAM 認証を使用している場合。

  • リクエストの署名に使用された IAM 認証情報が正しくないか、API を呼び出す権限がない場合。

  • 署名された API リクエストの署名が、AWS サービスが計算した署名と一致していない場合。

  • API リクエストヘッダーが正しくない場合。

注記

他のエラー解決策を検討する前に、AWS Signature Version 2 (SigV2) から AWS Signature Version 4 (SigV4) に更新してください。Amazon S3 などのサービスやリージョンは SigV2 署名をサポートしなくなりました。

認証情報エラー

API リクエストが SigV4 で署名されていることを確認します。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 Date または x-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 CLI を使用して AWS へのリクエストを行います。例については、「リクエスト署名の例」を参照してください。