AWS S3-「計算したリクエスト署名が署名と一致しません」エラーを修正する方法は?


95

私は2日以上ウェブで検索し、おそらくオンラインで文書化されたシナリオと回避策のほとんどを調べましたが、今のところ何もうまくいきませんでした。

私は上だAWS SDK PHP V2.8.7は、PHP 5.3で実行しているため。

次のコードでS3バケットに接続しようとしています:

// Create a `Aws` object using a configuration file

        $aws = Aws::factory('config.php');

        // Get the client from the service locator by namespace
        $s3Client = $aws->get('s3');

        $bucket = "xxx";
        $keyname = "xxx";

        try {
            $result = $s3Client->putObject(array(
                'Bucket'        =>      $bucket,
                'Key'           =>      $keyname,
                'Body'          =>      'Hello World!'
            ));
            $file_error = false;
        } catch (Exception $e) {
            $file_error = true;
            echo $e->getMessage();
            die();
        }
        //  

私のconfig.phpファイルは次のとおりです。

<?php

return array(
    // Bootstrap the configuration file with AWS specific features
    'includes' => array('_aws'),
    'services' => array(
        // All AWS clients extend from 'default_settings'. Here we are
        // overriding 'default_settings' with our default credentials and
        // providing a default region setting.
        'default_settings' => array(
            'params' => array(
                'credentials' => array(
                    'key'    => 'key',
                    'secret' => 'secret'
                )
            )
        )
    )
);

次のエラーが発生しています。

計算したリクエストの署名が、指定した署名と一致しません。キーと署名方法を確認してください。

私はすでにアクセスキーとシークレットを少なくとも20回チェックし、新しいものを生成し、さまざまな方法を使用して情報を渡しました(つまり、プロファイルとコードへの資格情報の組み込み)が、現時点では何も機能していません。


3
そのため、AWS SDKは、一連の直接API呼び出しを実装するだけです。AWSでは、すべての呼び出しで秘密鍵(またはそれsecret以上)を取得し、それを使用して、アクセス鍵、現在のタイムスタンプ、およびその他の多くの要素に基づいて署名を計算します。docs.aws.amazon.com/general/latest/gr/…を参照してください。ロングショットですが、タイムスタンプが含まれていることを考えると、おそらくローカル環境の時間はずれていますか?
Josh Padnick 2015年

Content-Lengthオブジェクトメタデータで誤ったサイズ()を渡したときに発生しました。(長いバージョン:JavaHttpServletRequestからS3クライアントに入力ストリームを直接渡し、メタデータrequest.getContentLength()Content-Length介して渡していました。サーブレットが(ランダムに)チャンクされたリクエストを受信して​​いるときに(Transfer-Encoding: chunkedgetContentLength()が返されていました-1-これはputObject失敗につながりました(ランダムに)。あいまいですが、間違ったオブジェクトサイズを渡していたため、明らかに私たちのせいです。)
JanakaBandara20年

Joshのラップトップの時間は1時間ずれていました(何らかの理由で、ロンドンの時間ではなくモスクワに設定されていました)。お手伝いありがとう!
ロスシモンズ

回答:


82

2日間のデバッグの後、私はついに問題を発見しました...

オブジェクトに割り当てていたキーがピリオドで始まっていた..\images\ABC.jpgため、エラーが発生しました。

APIがより意味のある関連性のあるエラーメッセージを提供することを願っています、悲しいかな、これが他の誰かに役立つことを願っています!


状態バケットとキーが逆方向にありましたが、これはエラーです(署名が一致しません)。Wtfテラフォーム?
LO-タン

16
スラッシュもこの問題を引き起こしました。あなただけのパス/に/ファイル、いない/パス/に/ファイル必要
グラハム・

4
そして私にとっての問題は、キーの内側の空白でした
AdamSzmyd19年

4
これに加えて+、キーにプラス記号を入力すると、このエラーメッセージが表示されていました。
LCC

2
Content-Typeアップロードファイルリクエストでヘッダーを提供しなかったときにこれを取得していました
AngelVenchev20年

36

間違った資格情報でこのエラーが発生します。もともと貼り付けた時は見えない文字があったと思います。


3
ダブルクリックしたkey_hash_lala/key_hash_continuesだけで、1つのパーツしか選択されませんでした。残念ながら、ユーザーに「間違ったパスワード、おい!」と伝えるのはどれほど難しいですか?
UFOの

ダウンロード可能なcsvからキーをコピーする際に初めて問題が発生しました。私が作成した2番目のキーのために、私は、ブラウザからそれをコピーして、すべての問題を持っていなかった
nthaxis

@nthaxisに+1 -ブラウザから直接コピーし、それが御馳走に動作します-故障原因.csvファイルからのコピー
NKCampbell

14

いくつかのUTF8文字を含むオブジェクトをコピーしようとしたときに同じ問題が発生しました。以下はJSの例です。

var s3 = new AWS.S3();

s3.copyObject({
    Bucket: 'somebucket',
    CopySource: 'path/to/Weird_file_name_ðÓpíu.jpg',
    Key: 'destination/key.jpg',
    ACL: 'authenticated-read'
}, cb);

CopySourceをでエンコードすることで解決 encodeURIComponent()


11

このエラーは主に、秘密鍵の前後にスペースがある場合に発生するようです。


これは完全なヘルプです
Mr SCoder20年

同じ問題がありました。Skypeは、値を空白行でコピーすることがあります。メモ帳に貼り付けて、空白なしでコピーするだけです。
ミハル・michalak

はい !他のヘッダーにスペースがあるかどうかも確認してください。
EinoGourdin20年

6

実際、Javaでは同じエラーが発生していました.4時間かけてデバッグしたところ、s3ファイルのキャッシュコントロールにスペースがあったため、S3オブジェクトのメタデータに問題があることがわかりました。このスペースは1.6で許可されていました。*バージョンですが、1.11。*では許可されていないため、署名の不一致エラーがスローされていました


Content-Lengthメタデータに間違ったものを渡した場合にも発生します
JanakaBandara20年

4

私にとってはaxiosを使用し、deafultによってヘッダーを送信します

content-type: application/x-www-form-urlencoded

だから私は送信するように変更します:

content-type: application/octet-stream

また、このContent-TypeをAWSシグネチャに追加する必要がありました

const params = {
    Bucket: bucket,
    Key: key,
    Expires: expires,
    ContentType = 'application/octet-stream'
}

const s3 = new AWS.S3()
s3.getSignedUrl('putObject', params)

3

上記の他の解決策のどれもあなたのために機能しない場合は、使用してみてください

aws configure

このコマンドは、キー、リージョン、および出力形式を要求する一連のオプションを開きます。

お役に立てれば!


3

以前のバージョンのaws-php-sdkでは、S3Client::factory()メソッドが廃止される前は、ファイルパスの一部を配置するかKeyS3Client->putObject()パラメーターで呼び出されるように、バケットパラメーターに配置することが許可されていました。v2 SDKを使用して、本番環境で使用するファイルマネージャーがありました。ファクトリメソッドはまだ機能していたので、に更新し~3.70.0た後、このモジュールに再度アクセスしませんでした。今日、私は2時間の大部分をデバッグに費やし、なぜこのエラーが発生し始めたのかをデバッグしました。これは、渡したパラメーター(以前は機能していた)が原因でした。

$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2006-03-01'
]);
$result = $s3Client->putObject([
    'Bucket' => 'awesomecatpictures/catsinhats',
    'Key' => 'whitecats/white_cat_in_hat1.png',
    'SourceFile' => '/tmp/asdf1234'
]);

catsinhatsバケット/キーパスの一部を次のKeyようにパラメータに移動する必要がありました。

$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2006-03-01'
]);
$result = $s3Client->putObject([
    'Bucket' => 'awesomecatpictures',
    'Key' => 'catsinhats/whitecats/white_cat_in_hat1.png',
    'SourceFile' => '/tmp/asdf1234'
]);

私が起こっていると私が信じているのは、Bucket名前が現在URLエンコードされているということです。SDKから受け取った正確なメッセージをさらに調べたところ、次のことがわかりました。

での実行中PutObjectにエラーが発生しましたhttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png

AWS HTTPエラー:クライアントエラー: PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png結果として403 Forbidden

これは/Bucketパラメータに提供したものが終了しurlencode()、現在は終了していることを示しています%2F

署名の動作方法はかなり複雑ですが、問題はバケットに要約され、暗号化された署名を生成するためにキーが使用されます。呼び出し元のクライアントとAWS内の両方で完全に一致しない場合、リクエストは403で拒否されます。エラーメッセージは実際には問題を示しています。

計算したリクエストの署名が、指定した署名と一致しません。キーと署名方法を確認してください。

だから、私Keyが間違っていたので、私は間違っていBucketました。


3

nodejsでも同じエラーが発生しました。しかしsignatureVersion、s3コンストラクターを追加することは私を助けました:

const s3 = new AWS.S3({
  apiVersion: '2006-03-01',
  signatureVersion: 'v4',
});

私がこれに出くわす前に多くのことを試みました!これが私にとっての答えでした。
DavidG

3

私の場合、使用s3.getSignedUrl('getObject')する必要があるときに使用していましたs3.getSignedUrl('putObject')(PUTを使用してファイルをアップロードしているため)。そのため、署名が一致しませんでした。


長い時間の後に私を救った。ありがとうございました!!
キシンガ


2

ReactNativeでAWSSDKを使用してS3に画像をアップロードすることを体験しました。ContentEncodingパラメータが原因であることが判明しました。

そのパラメータを削除すると、問題が「修正」されました。


2

私も同じ問題を抱えていました。デフォルトのメソッドであるPUTを設定して事前署名されたURLを定義しましたが、GETを実行しようとしていました。エラーはメソッドの不一致が原因でした。


これは私のために働いた。署名付きURLの生成に使用されるHTTP動詞(PUT、POST)は、そのURLでアップロードを実行するときに使用される動詞と同じである必要があります。
craigcaulfield

1

同様のエラーが発生しましたが、私にとっては、IAMユーザーを再利用して2つの異なるElasticBeanstalk環境でS3を操作したことが原因のようです。環境ごとに同じ権限を持つIAMユーザーを作成することで症状を処理したところ、エラーは解消されました。


1

私の場合、S3URLをそのコンポーネントに解析しました。

例えば:

Url:    s3://bucket-name/path/to/file

解析された:

Bucket: bucket-name
Path:   /path/to/file

パス部分に先頭の「/」が含まれていると、要求が失敗しました。


1

もう1つの考えられる問題は、メタ値に非US-ASCII文字が含まれていることです。私にとっては、putRequestに値を追加するときに値をUrlEncodeするのに役立ちました。

request.Metadata.Add(AmzMetaPrefix + "artist", HttpUtility.UrlEncode(song.Artist));
request.Metadata.Add(AmzMetaPrefix + "title", HttpUtility.UrlEncode(song.Title));

1

AWS s3バケットのパブリックパーミッションを変更し、バケット設定に以下のCORS構成を追加することで、この問題を解決しました。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

詳細については、AWSs3のドキュメントを参照してください。


1

ほとんどの場合、キー(AWS_SECRET_ACCESS_KEY)が間違っているために発生します。AWS_SECRET_ACCESS_KEYを相互検証してください。それがうまくいくことを願っています...


1

オブジェクトをコピーしようとしたときにこのエラーが発生しました。copySourceをエンコードして修正しました。これは実際にはメソッドのドキュメントに記載されています。

パラメータ:copySource –スラッシュ(/)で区切られたソースバケットの名前とソースオブジェクトのキー名。URLエンコードする必要があります。

CopyObjectRequest objectRequest = CopyObjectRequest.builder()
                .copySource(URLEncoder.encode(bucket + "/" + oldFileKey, "UTF-8"))
                .destinationBucket(bucket)
                .destinationKey(newFileKey)
                .build();

1

私の場合、AWS署名承認メソッドでpostmanを使用してリクエストを行うときに、サービス名としてS3(大文字)を使用していました


AWSサインを広告する場所の詳細を追加していただけますか?
Mr SCoder20年

1

デバッグして多くの時間を費やした後、私の場合、問題はaccess_key_idとsecret_access_keyにありました。資格情報を再確認するか、可能であれば新しい資格情報を生成して、paramsで資格情報を渡していることを確認してください。


上記の回答を読んだとき、秘密鍵を再確認し、最後に/を追加したことに気づきました。
EzrqnKemboi20年

0

私の場合、バケット名が間違っていました。キーの最初の部分(bucketxxx / keyxxx)が含まれていました。署名に問題はありませんでした。


0

私の場合(python)、ファイルにこれらの2行のコードがあり、古いコードから継承されているため、失敗しました。

http.client.HTTPConnection._http_vsn = 10 http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'


0

awscliDebianストレッチで利用可能な最新バージョン、つまりバージョン1.11.13を使用しているときに、AWSS3以外のエンドポイントを持つDockerイメージでこれに遭遇しました。

CLIバージョン1.16.84にアップグレードすると、問題が解決しました。

次の代わりに、Debianストレッチイメージに基づくDockerfileを使用してCLIの最新バージョンをインストールするには:

RUN apt-get update
RUN apt-get install -y awscli
RUN aws --version

使用する:

RUN apt-get update
RUN apt-get install -y python-pip
RUN pip install awscli
RUN aws --version

0

私は設定しなければなりませんでした

Aws.config.update({
  credentials: Aws::Credentials.new(access_key_id, secret_access_key)
})

以前はrubyaws sdk v2を使用していました(おそらく他の言語でもこれに似たものがあります)


0

ブラウザで出力されたURLをテストしようとしているときに誰かがこの問題に遭遇したかどうかはわかりませんがPostman、AWSの生成されたURLを使用してRAWタブからコピーしようとすると、バックスラッシュをエスケープするため、上記のエラーが発生します。

Prettyタブを使用してURLをコピーして貼り付け、実際に機能するかどうかを確認します。

私は最近この問題に遭遇し、この解決策は私の問題を解決しました。これは、実際にURLを介してデータを取得するかどうかを確認するためのテスト目的です。

この回答は、AWSからダウンロード、一時リンクを生成しようとする人、または一般的にAWSから使用するURLを生成しようとする人への参照です。


0

私の場合の問題は、Amplifyの構成に使用されたAPI Gateway URLで、最後に余分なスラッシュがありました...

クエリされたURLは次のようになりましたhttps://....amazonaws.com/myapi//myendpoint。confの余分なスラッシュを削除すると、機能しました。

私の人生で最も明白なエラーメッセージではありません。


0

私の場合、s3request.promise().then()incorrecltyを呼び出していたため、1回の呼び出しだけが実行されたときに、要求が2回実行されました。

つまり、6つのオブジェクトを反復処理していましたが、12の要求が行われました(コンソールにログインするか、ブラウザーでネットワークをデバッグすることで確認できます)。

2番目の不要な要求のタイムスタンプが最初の要求の署名と一致しなかったため、この問題が発生しました。


0

Java SDKを介してCloudSearchにドキュメントをアップロードしているときに、このエラーが発生しました。この問題は、アップロードするドキュメントの特殊文字が原因でした。「計算したリクエストの署名が、指定した署名と一致しません。AWSシークレットアクセスキーと署名方法を確認してください。」というエラーが表示されます。非常に誤解を招くです。


0

新しいアクセスキーを生成することは私のために働いた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.