AWS S3 - Cách khắc phục lỗi 'Chữ ký yêu cầu mà chúng tôi đã tính toán không khớp với chữ ký'?


90

Tôi đã tìm kiếm trên web hơn hai ngày nay và có lẽ đã xem qua hầu hết các tình huống và cách giải quyết được ghi chép trực tuyến, nhưng cho đến nay vẫn chưa có kết quả nào đối với tôi.

Tôi đang sử dụng AWS SDK cho PHP V2.8.7 chạy trên PHP 5.3.

Tôi đang cố gắng kết nối với bộ chứa S3 của mình bằng mã sau:

// 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();
        }
        //  

Tệp config.php của tôi như sau:

<?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'
                )
            )
        )
    )
);

Nó đang tạo ra lỗi sau:

Chữ ký yêu cầu mà chúng tôi tính toán không khớp với chữ ký bạn đã cung cấp. Kiểm tra khóa và phương thức ký của bạn.

Tôi đã kiểm tra khóa truy cập và khóa bí mật của mình ít nhất 20 lần, tạo khóa mới, sử dụng các phương pháp khác nhau để chuyển thông tin (tức là hồ sơ và bao gồm thông tin đăng nhập trong mã) nhưng không có gì hoạt động vào lúc này.


3
Vì vậy, AWS SDK chỉ triển khai một loạt các lệnh gọi API trực tiếp. Với AWS, mỗi cuộc gọi bạn thực hiện đều lấy khóa cá nhân của bạn (hoặc secretcao hơn) và sử dụng khóa đó để tính toán chữ ký dựa trên khóa truy cập của bạn, dấu thời gian hiện tại, cộng với một loạt các yếu tố khác. Xem docs.aws.amazon.com/general/latest/gr/… . Đó là một tầm nhìn xa, nhưng do chúng bao gồm dấu thời gian, có lẽ thời gian môi trường địa phương của bạn đã tắt?
Josh Padnick

Xảy ra khi chúng tôi truyền kích thước không chính xác ( Content-Length) trong siêu dữ liệu đối tượng. (Phiên bản Long: chúng tôi đã trực tiếp đi qua các dòng đầu vào từ một Java HttpServletRequestcho khách hàng S3, và đi qua trong request.getContentLength()khi Content-Lengthqua siêu dữ liệu; khi servlet được (yêu cầu một cách ngẫu nhiên) nhận chunked ( Transfer-Encoding: chunked), getContentLength()đã trở về -1- mà dẫn putObjectđến thất bại (ngẫu nhiên). Ít người biết đến; nhưng rõ ràng là lỗi của chúng tôi vì chúng tôi đã chuyển kích thước đối tượng không chính xác.)
Janaka Bandara

Josh thời gian sử dụng máy tính xách tay của tôi đã tắt một giờ (vì một số lý do nó được đặt thành Moscow chứ không phải giờ London). Cảm ơn bạn vì sự giúp đỡ!
Ross Symonds

Câu trả lời:


79

Sau hai ngày gỡ lỗi, cuối cùng tôi đã phát hiện ra vấn đề ...

Khóa tôi đã gán cho đối tượng bắt đầu bằng dấu chấm tức là ..\images\ABC.jpg, và điều này gây ra lỗi xảy ra.

Tôi ước API cung cấp thông báo lỗi có ý nghĩa và phù hợp hơn, than ôi, tôi hy vọng điều này sẽ giúp ích cho những người khác!


Tôi đã có thùng trạng thái và khóa ngược và đây là lỗi bạn gặp phải (chữ ký không khớp). Địa hình wtf?
Lo-Tan

14
Một dấu gạch chéo hàng đầu cũng gây ra vấn đề này cho tôi. Bạn chỉ cần path / to / file, không / path / to / file
Graham

3
Và đối với tôi, vấn đề là khoảng trắng bên trong phím
Adam Szmyd

3
Thêm vào đó, tôi đã nhận được thông báo lỗi này khi có dấu cộng +trong khóa của mình.
LCC

1
Tôi nhận được điều này khi tôi không cung cấp Content-Typetiêu đề trong yêu cầu tệp tải lên của mình
Angel Venchev

34

Tôi gặp lỗi này với thông tin đăng nhập sai. Tôi nghĩ rằng có những ký tự vô hình khi tôi dán nó ban đầu.


3
Tôi chỉ cần nhấp chuột vào dobuble key_hash_lala/key_hash_continuesvà nó chỉ chọn một phần. Than ôi, thật khó để nói với người dùng "mật khẩu sai, anh bạn!"?
Ufos

Lần đầu tiên tôi gặp sự cố khi sao chép khóa từ csv có thể tải xuống. Đối với khóa thứ hai tôi tạo ra, tôi chỉ cần sao chép nó từ trình duyệt và không có bất kỳ vấn đề
nthaxis

+1 đến @nthaxis - sao chép từ .csv gây ra một sự thất bại - sao chép trực tiếp từ trình duyệt và nó hoạt động một điều trị
NKCampbell

14

Tôi đã gặp vấn đề tương tự khi cố gắng sao chép một đối tượng có một số ký tự UTF8. Dưới đây là một ví dụ 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);

Giải quyết bằng cách mã hóa CopySource với encodeURIComponent()


9

Lỗi này hầu như thường xảy ra nếu có khoảng trắng trước hoặc sau khóa bí mật của bạn


đây là trợ giúp đầy đủ
Mr S Coder

Có cùng một vấn đề. Skype đôi khi sao chép các giá trị với các dòng trống. Chỉ cần dán nó vào notepad và sau đó sao chép nó mà không có khoảng trắng.
michal-michalak

Đúng ! Cũng kiểm tra xem bạn có khoảng trắng trong bất kỳ tiêu đề nào khác không.
Eino Gourdin

6

Trên thực tế, trong Java, tôi cũng gặp phải lỗi tương tự. nhưng ở phiên bản 1.11. * nó không được phép và do đó đã gây ra lỗi không khớp chữ ký


Cũng xảy ra nếu bạn chuyển sai Content-Lengthtrong siêu dữ liệu
Janaka Bandara

3

Đối với tôi, tôi đã sử dụng axios và bằng cách tắt nó gửi tiêu đề

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

vì vậy tôi thay đổi để gửi:

content-type: application/octet-stream

và cũng phải thêm Loại-Nội dung này vào chữ ký AWS

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

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

3

Trong phiên bản trước của aws-php-sdk, trước khi S3Client::factory()phương pháp này không được dùng nữa , bạn được phép đặt một phần của đường dẫn tệp hoặc Keynhư nó được gọi trong S3Client->putObject()tham số , trên tham số thùng. Tôi đã có một trình quản lý tệp trong việc sử dụng sản xuất, bằng cách sử dụng SDK v2. Vì phương pháp gốc vẫn hoạt động, tôi đã không truy cập lại mô-đun này sau khi cập nhật lên ~3.70.0. Hôm nay, tôi đã dành phần tốt hơn trong hai giờ để gỡ lỗi tại sao tôi bắt đầu nhận được lỗi này và nó kết thúc là do các thông số tôi đã chuyển (đã từng hoạt động):

$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'
]);

Tôi đã phải di chuyển catsinhatsphần đường dẫn nhóm / khóa của mình sang Keytham số, như sau:

$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'
]);

Điều tôi tin đang xảy ra là Buckettên hiện đang được Mã hóa URL. Sau khi kiểm tra thêm về thông báo chính xác mà tôi nhận được từ SDK, tôi nhận thấy điều này:

Lỗi khi thực thi PutObjecttrênhttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png

Lỗi HTTP AWS: Lỗi ứng dụng khách: PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.pngdẫn đến403 Forbidden

Điều này cho thấy rằng thông số /tôi cung cấp cho Buckettham số của mình đã trải qua urlencode()và hiện tại %2F.

Cách hoạt động của Chữ ký khá phức tạp, nhưng vấn đề nằm ở nhóm và khóa được sử dụng để tạo chữ ký được mã hóa. Nếu chúng không khớp chính xác trên cả ứng dụng khách đang gọi và trong AWS, thì yêu cầu sẽ bị từ chối với mã 403. Thông báo lỗi thực sự chỉ ra vấn đề:

Chữ ký yêu cầu mà chúng tôi tính toán không khớp với chữ ký bạn đã cung cấp. Kiểm tra khóa và phương thức ký của bạn.

Vì vậy, tôi Keyđã sai bởi vì tôi Bucketđã sai.


3

Tôi đã gặp lỗi tương tự trong nodejs. Nhưng việc thêm hàm tạo signatureVersions3 đã giúp tôi:

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

Đã thử nhiều thứ trước khi tôi vấp phải điều này! Đây là câu trả lời cho tôi.
DavidG

2

Nếu không có giải pháp nào khác được đề cập phù hợp với bạn, thì hãy thử sử dụng

aws configure

lệnh này sẽ mở một tập hợp các tùy chọn yêu cầu khóa, khu vực và định dạng đầu ra.

Hi vọng điêu nay co ich!


2

Tôi vừa gặp sự cố này khi tải hình ảnh lên S3 bằng AWS SDK với React Native. Hóa ra là do ContentEncodingtham số.

Xóa thông số đó đã "khắc phục" sự cố.


2

Tôi gặp vấn đề tương tự. Tôi đã đặt phương pháp mặc định, PUT để xác định URL được ký trước nhưng đang cố gắng thực hiện GET. Lỗi là do phương pháp không khớp.


Điều này đã làm việc cho tôi. Động từ HTTP (PUT, POST) được sử dụng để tạo URL đã ký phải giống với động từ được sử dụng khi thực hiện tải lên với URL đó.
craigcaulfield

2

Trong trường hợp của tôi, tôi đang sử dụng s3.getSignedUrl('getObject')khi cần sử dụng s3.getSignedUrl('putObject')(vì tôi đang sử dụng PUT để tải tệp của mình lên), đó là lý do tại sao chữ ký không khớp.


Đã cứu tôi sau nhiều giờ. Cảm ơn bạn!!
Kisinga

1

Tôi đã gặp lỗi tương tự, nhưng đối với tôi thì có vẻ như do sử dụng lại người dùng IAM để làm việc với S3 trong hai môi trường Elastic Beanstalk khác nhau. Tôi đã xử lý hiện tượng này bằng cách tạo một người dùng IAM được cấp phép giống hệt nhau cho từng môi trường và điều đó đã làm cho lỗi biến mất.


1

Trong trường hợp của tôi, tôi đã phân tích cú pháp url S3 thành các thành phần của nó.

Ví dụ:

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

Đã được phân tích cú pháp thành:

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

Yêu cầu có phần đường dẫn chứa '/' đứng đầu không thành công.


1

Một vấn đề khác có thể xảy ra là các giá trị meta chứa các ký tự không phải US-ASCII. Đối với tôi, nó đã giúp UrlEncode các giá trị khi thêm chúng vào putRequest:

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

1

Tôi đã giải quyết vấn đề này bằng cách thay đổi quyền công khai trên nhóm AWS s3 của mình và bằng cách thêm cấu hình CORS bên dưới vào cài đặt nhóm của tôi.

<?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>

Xem tài liệu AWS s3 để biết thêm thông tin.


1

Hầu hết thời gian nó xảy ra do khóa sai (AWS_SECRET_ACCESS_KEY). Vui lòng xác minh chéo AWS_SECRET_ACCESS_KEY của bạn. Hy vọng nó sẽ hoạt động ...


1

Tôi gặp lỗi này khi cố gắng sao chép một đối tượng. Tôi đã sửa nó bằng cách mã hóa copySource. Điều này thực sự được mô tả trong tài liệu phương pháp:

Tham số: copySource - Tên của nhóm nguồn và tên khóa của đối tượng nguồn, được phân tách bằng dấu gạch chéo (/). Phải được mã hóa URL.

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

1

Trong trường hợp của tôi, tôi đang sử dụng S3 (chữ hoa) làm tên dịch vụ khi thực hiện yêu cầu bằng người đưa thư trong phương thức Ủy quyền chữ ký AWS


bạn có thể vui lòng thêm chi tiết ở đâu để đăng quảng cáo AWS không?
Mr S Coder

1

Sau khi gỡ lỗi và dành nhiều thời gian, trong trường hợp của tôi, vấn đề là với access_key_id và secret_access_key, chỉ cần kiểm tra lại thông tin đăng nhập của bạn hoặc tạo một thông tin mới nếu có thể và đảm bảo rằng bạn đang chuyển thông tin đăng nhập vào params.


Khi tôi đọc câu trả lời ở trên, tôi đã kiểm tra lại khóa bí mật của mình và nhận ra rằng tôi đã thêm / vào cuối.
Ezrqn Kemboi


0

Trong trường hợp của tôi, tên thùng bị sai, nó bao gồm phần đầu tiên của khóa (bucketxxx / keyxxx) - không có gì sai với chữ ký.


0

Trong trường hợp của tôi (python), nó không thành công vì tôi có hai dòng mã này trong tệp, được kế thừa từ mã cũ hơn

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


0

Tôi gặp sự cố này trong hình ảnh Docker, với điểm cuối không phải AWS S3, khi sử dụng awscliphiên bản mới nhất có sẵn cho Debian căng, tức là phiên bản 1.11.13.

Nâng cấp lên CLI phiên bản 1.16.84 đã giải quyết được sự cố.

Để cài đặt phiên bản CLI mới nhất bằng Dockerfile dựa trên ảnh căng Debian, thay vì:

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

Sử dụng:

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

0

Tôi phải đặt

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

trước đó với ruby ​​aws sdk v2 (có thể có điều gì đó tương tự với điều này trong các ngôn ngữ khác)


0

Tôi không biết có ai gặp sự cố này khi cố gắng kiểm tra URL được xuất trong trình duyệt hay không nhưng nếu bạn đang sử dụng Postmanvà cố gắng sao chép url được tạo của AWS từ RAWtab, vì thoát dấu gạch chéo ngược, bạn sẽ gặp lỗi trên .

Sử dụng Prettytab để sao chép và dán url để xem nó có thực sự hoạt động hay không.

Tôi gặp sự cố này gần đây và giải pháp này đã giải quyết được sự cố của tôi. Nó nhằm mục đích thử nghiệm để xem liệu bạn có thực sự truy xuất dữ liệu thông qua url hay không.

Câu trả lời này là tham chiếu đến những người cố gắng tạo tải xuống, liên kết tạm thời từ AWS hoặc nói chung là tạo URL từ AWS để sử dụng.


0

Vấn đề trong trường hợp của tôi là URL API Gateway được sử dụng để định cấu hình Amplify có thêm dấu gạch chéo ở cuối ...

Url được truy vấn trông như thế nào https://....amazonaws.com/myapi//myendpoint. Tôi đã loại bỏ dấu gạch chéo thêm trong tâm sự và nó hoạt động.

Không phải là thông báo lỗi rõ ràng nhất trong cuộc đời tôi.


0

Trong trường hợp của tôi, tôi đã gọi là liêm s3request.promise().then()khiết khiến hai lần thực hiện yêu cầu xảy ra khi chỉ một lệnh được thực hiện.

Ý tôi là tôi đã lặp qua 6 đối tượng nhưng 12 yêu cầu đã được thực hiện (bạn có thể kiểm tra bằng cách đăng nhập vào bảng điều khiển hoặc mạng gỡ lỗi trong trình duyệt)

Vì dấu thời gian cho yêu cầu thứ hai, không mong muốn, không khớp với dấu hiệu của yêu cầu đầu tiên nên đã tạo ra vấn đề này.


0

Gặp lỗi này khi tải tài liệu lên CloudSearch thông qua Java SDK. Vấn đề là do một ký tự đặc biệt trong tài liệu được tải lên. Lỗi "Chữ ký yêu cầu mà chúng tôi tính toán không khớp với chữ ký bạn đã cung cấp. Hãy kiểm tra Khóa truy cập bí mật AWS của bạn và phương pháp ký". là rất sai lầm.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.