AWS S3- '계산 한 요청 서명이 서명과 일치하지 않습니다'오류를 수정하는 방법은 무엇입니까?


89

지금까지 이틀 넘게 웹에서 검색했으며 온라인 문서화 된 시나리오와 해결 방법의 대부분을 살펴 봤지만 지금까지 아무런 효과가 없었습니다.

저는 PHP 5.3에서 실행되는 PHP V2.8.7 용 AWS SDK 를 사용하고 있습니다.

다음 코드를 사용하여 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개체 메타 데이터에 잘못된 크기 ( )를 전달했을 때 발생했습니다 . (긴 버전 : 입력 스트림을 Java HttpServletRequest에서 S3 클라이언트 로 직접 전달하고 메타 데이터 request.getContentLength()Content-Length통해 전달했습니다 . 서블릿이 (무작위로) 청크 된 요청을 수신 할 때 ( Transfer-Encoding: chunked), getContentLength()반환 중이 었는데 , -1이로 인해 putObject(무작위로) 실패했습니다. 모호하지만 잘못된 개체 크기를 전달했기 때문에 분명히 우리의 잘못입니다.)
Janaka Bandara

Josh는 내 노트북 ​​사용 시간이 한 시간 쉬었습니다 (어떤 이유로 런던 시간이 아닌 모스크바로 설정되었습니다). 도와 주셔서 감사합니다!
Ross Symonds

답변:


79

이틀간의 디버깅 끝에 마침내 문제를 발견했습니다.

객체에 할당 한 키는 마침표 즉 ..\images\ABC.jpg, 이로 인해 오류가 발생했습니다.

API가 더 의미 있고 관련성있는 오류 메시지를 제공하기를 바랍니다. 아아, 이것이 다른 사람에게 도움이되기를 바랍니다.


나는 상태 버킷과 키를 거꾸로 가지고 있었고 이것은 당신이 얻는 오류입니다 (서명이 일치하지 않습니다). 테라 폼?
Lo-Tan

14
선행 슬래시도이 문제를 일으켰습니다. 당신은 경로 /에 /이 아니라 파일 / 경로 /로 / 파일이 필요
그레이엄

3
그리고 저에게 문제는 키 내부의 공백 이었습니다
Adam Szmyd

3
여기에 추가하기 위해 +키에 더하기 기호 가 있을 때이 오류 메시지가 표시 되었습니다.
LCC

1
Content-Type업로드 파일 요청에 헤더를 제공하지 않았을 때이 문제가 발생했습니다
Angel Venchev

33

잘못된 자격 증명으로이 오류가 발생합니다. 원래 붙였을 때 보이지 않는 캐릭터가 있었던 것 같아요.


3
간단히 두 번 클릭하면 key_hash_lala/key_hash_continues한 부분 만 선택되었습니다. 아아, 사용자에게 "잘못된 암호, 친구!"라고 말하는 것이 얼마나 어렵습니까?
Ufos

다운로드 가능한 csv에서 키를 복사하는 데 처음으로 문제가 발생했습니다. 내가 만든 두 번째 키의 경우 브라우저에서 복사 한 후 아무런 문제가 없었습니다
nthaxis

+1 to @nthaxis-.csv에서 복사하면 오류가 발생했습니다. 브라우저에서 직접 복사하면 작동합니다.
NKCampbell

13

일부 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()


9

이 오류는 주로 비밀 키 앞뒤에 공백이있는 경우 발생하는 것 같습니다.


이것은 전체 도움말입니다
Mr S Coder

같은 문제가있었습니다. Skype는 때때로 빈 줄로 값을 복사합니다. 메모장에 붙여 넣은 다음 공백없이 복사하면됩니다.
michal-michalak

예 ! 다른 헤더에 공백이 있는지도 확인하십시오.
Eino Gourdin

6

실제로 Java에서 동일한 오류가 발생했습니다. 디버그하는 데 4 시간을 소비 한 후 S3 파일에 캐시 컨트롤을 배치하는 동안 공간이 있었기 때문에 S3 객체의 메타 데이터에 문제가 있음을 발견했습니다.이 공간은 1.6. *에서 허용되었습니다. 버전이지만 1.11. *에서는 허용되지 않으므로 서명 불일치 오류가 발생했습니다.


Content-Length메타 데이터에 잘못된 내용을 전달하는 경우에도 발생합니다
Janaka Bandara

3

언급 된 다른 솔루션 중 어느 것도 효과가 없으면 다음을 사용해보십시오.

aws configure

이 명령 은 키, 지역 및 출력 형식을 묻는 옵션 세트를 엽니 다.

도움이 되었기를 바랍니다!


3

나를 위해 나는 axios를 사용했고 귀머거리로 헤더를 보냅니다.

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-php-sdk의 이전 버전에서는 S3Client::factory()메서드 가 더 이상 사용되지 않기 전에 파일 경로의 일부를 배치하거나 파라미터Key 에서 호출 된대로 버킷 파라미터에 배치 할 수있었습니다. v2 SDK를 사용하는 프로덕션 용 파일 관리자가있었습니다. 팩토리 방법이 여전히 작동했기 때문에 .NET으로 업데이트 한 후이 모듈을 다시 방문하지 않았습니다 . 오늘 나는 왜 내가이 오류를 받기 시작한 이유를 디버깅하는 데 2 ​​시간의 더 좋은 부분을 보냈고, 그것은 내가 전달하는 (이전에는 작동했던) 매개 변수 때문이었다.S3Client->putObject()~3.70.0

$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에서받은 정확한 메시지를 추가로 검사 한 후 다음을 발견했습니다.

오류가 실행 PutObjecthttps://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매개 변수에 제공 한 I 가 완료되었으며 urlencode()현재 임을 보여줍니다 %2F.

서명이 작동하는 방식은 상당히 복잡하지만 문제는 버킷으로 귀결되며 키는 암호화 된 서명을 생성하는 데 사용됩니다. 호출 클라이언트와 AWS 내에서 정확히 일치하지 않으면 403으로 요청이 거부됩니다. 오류 메시지는 실제로 문제를 지적합니다.

계산 한 요청 서명이 제공 한 서명과 일치하지 않습니다. 키 및 서명 방법을 확인하십시오.

그래서 제가 Key틀 렸기 때문에 Bucket틀 렸습니다.


3

nodejs에서 동일한 오류가 발생했습니다. 그러나 signatureVersions3 생성자를 추가하면 도움이되었습니다.

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

내가 이것을 우연히 발견하기 전에 많은 것을 시도했습니다! 이것이 제 답이었습니다.
DavidG

2

방금 React Native와 함께 AWS SDK를 사용하여 S3에 이미지를 업로드하는 것을 경험했습니다. 그것은 ContentEncoding매개 변수 로 인한 것으로 밝혀졌습니다 .

해당 매개 변수를 제거하면 문제가 "수정"되었습니다.


2

나는 같은 문제가 있었다. 기본 방법 인 PUT가 사전 서명 된 URL을 정의하도록 설정했지만 GET을 수행하려고했습니다. 메서드 불일치로 인해 오류가 발생했습니다.


이것은 나를 위해 일했습니다. 서명 된 URL을 생성하는 데 사용되는 HTTP 동사 (PUT, POST)는 해당 URL로 업로드를 수행 할 때 사용 된 동사와 동일해야합니다.
craigcaulfield

2

제 경우에는 (파일을 업로드하기 위해 PUT를 사용하고 있기 때문에) s3.getSignedUrl('getObject')사용해야 할 때 s3.getSignedUrl('putObject')사용하고 있었기 때문에 서명이 일치하지 않았습니다.


오랜 시간 후에 나를 구했습니다. 감사합니다!!
Kisinga

1

비슷한 오류가 발생했지만 두 가지 다른 Elastic Beanstalk 환경에서 S3를 사용하기 위해 IAM 사용자를 재사용하여 발생한 것 같습니다. 각 환경에 대해 동일하게 권한이 부여 된 IAM 사용자를 생성 하여 증상을 처리했으며 이로 인해 오류가 사라졌습니다.


1

제 경우에는 S3 URL을 해당 구성 요소로 구문 분석했습니다.

예를 들면 :

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

다음으로 구문 분석되었습니다.

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

선행 '/'가 포함 된 경로 부분이 요청에 실패했습니다.


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>

자세한 내용은 AWS s3 설명서 를 참조하십시오 .


1

대부분의 경우 잘못된 키 (AWS_SECRET_ACCESS_KEY)로 인해 발생합니다. AWS_SECRET_ACCESS_KEY를 교차 확인하십시오. 그것이 효과가 있기를 바랍니다 ...


1

개체를 복사하는 동안이 오류가 발생했습니다. copySource를 인코딩하여 수정했습니다. 이것은 실제로 메서드 문서에 설명되어 있습니다.

Params : copySource – 슬래시 (/)로 구분 된 소스 버킷의 이름과 소스 객체의 키 이름입니다. URL로 인코딩되어야합니다.

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

1

제 경우에는 AWS 서명 인증 방법에서 우편 배달부를 사용하여 요청할 때 서비스 이름으로 S3 (대문자)를 사용했습니다.


AWS Sign을 광고 할 위치를 자세히 추가해 주시겠습니까?
Mr S Coder

1

디버깅하고 많은 시간을 보낸 후 제 경우에는 access_key_id 및 secret_access_key에 문제가있었습니다. 가능하면 자격 증명을 다시 확인하거나 새 자격 증명을 생성하고 params에 자격 증명을 전달하고 있는지 확인하십시오.


위의 답변을 읽었을 때 비밀 키를 다시 확인하고 끝에 /를 추가했음을 깨달았습니다.
Ezrqn Kemboi


0

제 경우에는 버킷 이름이 잘못되었고 키의 첫 부분 (bucketxxx / keyxxx)이 포함되어 있습니다. 서명에는 아무런 문제가 없었습니다.


0

제 경우 (파이썬) 파일 에이 두 줄의 코드가 있었기 때문에 실패했습니다. 이전 코드에서 상속되었습니다.

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


0

awscliDebian stretch에서 사용할 수 있는 최신 버전 (예 : 버전 1.11.13)을 사용할 때 비 AWS S3 엔드 포인트가있는 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)
})

루비 aws sdk v2 이전에 (다른 언어에서도 이와 비슷한 것이있을 것입니다)


0

브라우저에서 출력 된 URL을 테스트 할 때이 문제가 발생했는지는 모르겠지만 백 슬래시를 이스케이프 처리하기 때문에 탭 Postman에서 AWS의 생성 된 URL을 사용 하고 복사하려고 RAW하면 위의 오류가 발생합니다. .

Pretty탭을 사용하여 URL을 복사하고 붙여 넣어 실제로 작동하는지 확인합니다.

최근에이 문제가 발생했고이 솔루션으로 문제가 해결되었습니다. URL을 통해 실제로 데이터를 검색하는지 확인하기위한 테스트 목적입니다.

이 답변은 AWS에서 다운로드, 임시 링크를 생성하거나 일반적으로 사용할 URL을 AWS에서 생성하려는 사람들에 대한 참조입니다.


0

제 경우 문제는 끝에 추가 슬래시가있는 Amplify를 구성하는 데 사용 된 API 게이트웨이 URL이었습니다.

쿼리 된 URL은 다음과 같습니다 https://....amazonaws.com/myapi//myendpoint. conf에서 여분의 슬래시를 제거하고 작동했습니다.

내 인생에서 가장 명백한 오류 메시지는 아닙니다.


0

제 경우에는 s3request.promise().then()호출이 하나만 수행되었을 때 두 번의 요청 실행이 발생 하는 부적절 함을 호출했습니다.

내 말은 내가 6 개의 객체를 반복했지만 12 개의 요청이 있었다는 것입니다 (콘솔에 로그인하거나 브라우저에서 네트워크를 디버깅하여 확인할 수 있습니다).

두 번째 원치 않는 요청의 타임 스탬프가이 문제를 일으킨 첫 번째 요청의 서명과 일치하지 않습니다.


0

Java SDK를 통해 CloudSearch에 문서를 업로드하는 동안이 오류가 발생했습니다. 문제는 업로드 할 문서의 특수 문자 때문이었습니다. "계산 한 요청 서명이 제공 한 서명과 일치하지 않습니다. AWS 보안 액세스 키 및 서명 방법을 확인하십시오."오류 매우 오해의 소지가 있습니다.


0

새로운 액세스 키를 생성하는 것이 저에게 효과적이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.