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

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

저는 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 번 이상 확인하고 새 암호를 생성하고 다른 방법을 사용하여 정보 (예 : 프로필 및 코드에 자격 증명 포함)를 전달했지만 현재 아무 것도 작동하지 않습니다.



답변

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

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

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


답변

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


답변

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


답변

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


답변

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


답변

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

aws configure

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

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


답변

나를 위해 나는 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)