it-swarm.com.ru

Как исправить ошибку "Рассчитанная нами подпись запроса не соответствует подписи"?

Я искал в Интернете более двух дней и, вероятно, просмотрел большинство задокументированных сценариев и обходных путей в Интернете, но пока у меня ничего не получалось.

Я нахожусь на 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 раз, сгенерировал новые, использовал различные методы для передачи информации (например, профиль и включение учетных данных в коде), но на данный момент ничего не работает.

25
Joseph Lam

После двух дней отладки я наконец обнаружил проблему ...

Ключ, который я назначил объекту, начинался с точки, то есть ..\images\ABC.jpg, и это приводило к возникновению ошибки.

Я хотел бы, чтобы API предоставил более значимое и актуальное сообщение об ошибке, увы, я надеюсь, что это поможет кому-то еще там!

28
Joseph Lam

Я получаю эту ошибку с неправильными учетными данными. Я думаю, что там были невидимые символы, когда я вставил его изначально.

14
Alex Levine

У меня была такая же проблема, когда я пытался скопировать объект с некоторыми символами 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()

5
ecdeveloper

На самом деле в Java я получал ту же ошибку. Потратив 4 часа на ее отладку, я обнаружил, что проблема заключалась в метаданных в объектах S3, так как было свободное место, когда элементы управления кэшем находились в файлах s3. Это пространство было разрешено в 1.6. * версия, но в 1.11. * она запрещена и, таким образом, выдавала ошибку несоответствия подписи

2
sarir

Я только что испытал эту загрузку изображения на S3, используя AWS SDK с React Native. Оказалось, что это вызвано параметром ContentEncoding.

Удаление этого параметра «исправило» проблему.

2
John Veldboom

Если ни одно из упомянутых решений не работает, попробуйте использовать

aws configure

эта команда откроет набор параметров, запрашивающих ключи, регион и формат вывода.

Надеюсь это поможет!

1
monothorn

Я столкнулся с этим в образе Docker с конечной точкой не-AWS S3, когда использовал последнюю версию awscli, доступную для растяжения Debian, то есть версию 1.11.13.

Обновление до версии CLI 1.16.84 решило проблему.

Чтобы установить последнюю версию CLI с Dockerfile, основанным на растянутом образе Debian, вместо:

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
RWD

В моем случае (python) это не удалось, потому что в файле были две строки кода, унаследованные от старого кода

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

0
Nir Soudry

Я должен был установить 

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

ранее с Ruby aws sdk v2 (возможно, что-то похожее и в других языках)

0
Yo Ludke

В моем случае я проанализировал URL S3 на его компоненты.

Например:

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

Был разобран в:

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

Часть пути, содержащая начальный символ '/', провалила запрос.

0
AVIDeveloper

У меня была похожая ошибка, но, по-моему, она была вызвана повторным использованием пользователя IAM для работы с S3 в двух разных средах Elastic Beanstalk. Я лечил симптом с помощью создания идентично разрешенного пользователя IAM для каждой среды и это позволило устранить ошибку.

0
Joseph Combs

Я мог бы решить эту проблему с помощью установки переменных среды. 

export AWS_ACCESS_KEY=
export AWS_SECRET_ACCESS_KEY=

В IntelliJ + py.test я устанавливаю переменные окружения с помощью [Run] > [Edit Configurations] > [Configuration] > [Environment] > [Environment variables]

0
MiaeKim

Для меня я использовал axios и по умолчанию отправляет заголовок

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

поэтому я изменяю, чтобы отправить:

content-type: application/octet-stream

а также пришлось добавить этот тип контента в подпись AWS

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

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

В моем случае имя корзины было неверным, оно включало первую часть ключа (bucketxxx/keyxxx) - в подписи не было ничего плохого.

0
Martin Flower

Другая возможная проблема может заключаться в том, что мета-значения содержат не символы US-ASCII. Для меня это помогло UrlEncode значения при добавлении их в putRequest:

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