AWS API リクエストの Signature Version 4 署名をトラブルシューティングする - AWS Identity and Access Management

AWS API リクエストの Signature Version 4 署名をトラブルシューティングする

重要

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 のエラーが表示されることがあります。リクエストに署名したエンティティがリクエストを行う権限を持っていることを確認してください。詳細については、「アクセス拒否エラーメッセージをトラブルシューティングする」を参照してください。

正規リクエストと署名文字列エラー

正規リクエストのハッシュを作成する または 署名文字列を作成する での正規化リクエストまたは署名する文字列を誤って計算した場合、サービスによって実行される署名の検証手順が失敗し、エラーメッセージが表示されます。

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 リクエストヘッダー

認可ヘッダーが空の場合、認証情報キーまたは署名が欠落しているか正しくない場合、ヘッダーがアルゴリズム名で始まらない場合、またはキーと値のペアに等号が含まれていない場合、次のいずれかのエラーが表示されます。

  • 認可ヘッダーを空にすることはできません。

  • 認可ヘッダーには「Credential」パラメータが必要です。

  • 認可ヘッダーには「Signature」パラメータが必要です。

  • 署名には、認可ヘッダーに無効な key=value ペア (等号の欠落) が含まれています。

署名を計算する に追加された SigV4 認可ヘッダーに適切な資格情報キーが含まれていること、また、HTTP Date または x-amz-date ヘッダーを使用してリクエスト日が含まれていることを確認してください。

IncompleteSignatureException エラーが表示され、署名の構成が正しい場合は、クライアント側のリクエストで認可ヘッダーの SHA-256 ハッシュと B64 エンコードを計算することで、認可ヘッダーが AWS のサービス への転送中に変更されていないことを確認できます。

  1. リクエストで送信した認可ヘッダーを取得します。認可ヘッダーは次の例のようになります。

    Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature
  2. 認可ヘッダーの SHA-256 ハッシュを計算します。

    hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
  3. ハッシュ化された認可ヘッダーを Base64 形式にエンコードします。

    base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
  4. 先ほど計算したハッシュ化およびエンコードされた文字列と、エラーメッセージで受け取った文字列を比較します。次の例に示すメッセージの例に似たメッセージが表示されます。

    com.amazon.coral.service#IncompleteSignatureException: The signature contains an in-valid key=value pair (missing equal-sign) in Authorization header (hashed with SHA-256 and encoded with Base64): '9c574f83b4b950926da4a99c2b43418b3db8d97d571b5e18dd0e4f3c3ed1ed2c'.
  • 2 つのハッシュが異なる場合、認可ヘッダーの一部が転送中に変更されます。この変更は、ネットワークまたはクライアントハンドラーが署名付きヘッダーをアタッチしたり、何らかの方法で認可ヘッダーを変更したりすることが原因である可能性があります。

  • 2 つのハッシュが一致した場合、リクエストで送信した認可ヘッダーは、AWS が受信したものと一致します。受信したエラーメッセージを確認して、問題が誤った認証情報または署名の結果であるかどうかを確認します。これらのエラーについては、このページの他のセクションで説明します。

認証情報範囲エラー

署名文字列を作成する で作成された認証情報の範囲により、署名は特定の日付、リージョン、およびサービスに制限されます。この文字列は以下の形式になります。

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 へのリクエストを行います。例については、「リクエスト署名の例」を参照してください。