Предоставленный вами механизм авторизации не поддерживается. Используйте AWS4-HMAC-SHA256


130

Я получаю сообщение об ошибке AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.при попытке загрузить файл в корзину S3 в новом регионе Франкфурта. Все исправно работает с US Standardрегионом.

Автор сценария:

backup_file = '/media/db-backup_for_dev/2014-10-23_02-00-07/slave_dump.sql.gz'
s3 = AWS::S3.new(
    access_key_id:     AMAZONS3['access_key_id'],
    secret_access_key: AMAZONS3['secret_access_key']
)

s3_bucket = s3.buckets['test-frankfurt']

# Folder and file name
s3_name = "database-backups-last20days/#{File.basename(File.dirname(backup_file))}_#{File.basename(backup_file)}"

file_obj = s3_bucket.objects[s3_name]
file_obj.write(file: backup_file)

aws-sdk (1.56.0)

Как это исправить?

Спасибо.


1
Этот ответ решил мою проблему: stackoverflow.com/questions/34483795/…
Бахадир Тасдемир

Ответы:


151

AWS4-HMAC-SHA256, также известный как версия подписи 4 («V4»), является одной из двух схем аутентификации, поддерживаемых S3.

Все регионы поддерживают V4, но стандарт США¹, и многие - но не все - другие регионы также поддерживают другую, более старую схему, Signature Version 2 («V2»).

Согласно http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... новые регионы S3, развернутые после января 2014 г., будут поддерживать только V4.

Поскольку Франкфурт был представлен в конце 2014 года, он не поддерживает V2, что предлагает вам использовать эта ошибка.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html объясняет, как включить V4 в различных SDK, если вы используете SDK, который имеет такую ​​возможность.

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


¹ US Standard- это прежнее название регионального развертывания S3, базирующегося в этом us-east-1регионе. С момента написания этого ответа «Amazon S3 переименовал Стандартный регион США в регион Восток США (Северная Вирджиния) в соответствии с региональными соглашениями об именах AWS». Для всех практических целей это всего лишь изменение наименования.


Это заглушает s3cmd-1.5.0-0.alpha3.fc20.noarch, который идет с Fedora 20. И, по-видимому, также заглушает 1.5.0-rc1 , самую последнюю на данный момент.
Дэвид Тонхофер

1
@DavidTonhofer, это кажется правильным. Похоже, что разработчики s3cmd еще не AWS4-HMAC-SHA256реализовали: github.com/s3tools/s3cmd/issues/402
Майкл - sqlbot

2
@ "Michael - sqlbot" ну, я пока переключился на "awscli". Для тех, кто спешит: yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET и т.д ...
Дэвид Тонхофер

aws-sdk v2, похоже, прекрасно поддерживает аутентификацию AWS4-HMAC-SHA256 "V4" (связанная проблема )
Jeewes

спасибо .. это полезно для меня
Manish Vadher

68

С узлом попробуйте

var s3 = new AWS.S3( {
    endpoint: 's3-eu-central-1.amazonaws.com',
    signatureVersion: 'v4',
    region: 'eu-central-1'
} );

34

Вы должны установить signatureVersion: 'v4'в configиспользовать новую версию знака:

AWS.config.update({
    signatureVersion: 'v4'
});

Работает для JSsdk.


3
Спас мой день! Не уверен, почему этот вариант не получил
широкой

26

Для людей, использующих boto3( Python SDK), используйте приведенный ниже код

from botocore.client import Config


s3 = boto3.resource(
    's3',
    aws_access_key_id='xxxxxx',
    aws_secret_access_key='xxxxxx',
    config=Config(signature_version='s3v4')
)

4
Я получаю сообщение об ошибке AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Итак, я добавил region_name='us-east-2' к приведенному выше коду
Aseem

13

Аналогичная проблема с PHP SDK, это работает:

$s3Client = S3Client::factory(array('key'=>YOUR_AWS_KEY, 'secret'=>YOUR_AWS_SECRET, 'signature' => 'v4', 'region'=>'eu-central-1'));

Важным моментом является то, signatureчтоregion


Обязательно ли указывать регион?
Чираг Мехта

13

Я использовал Django, и мне пришлось добавить эти дополнительные переменные конфигурации, чтобы это работало. (в дополнение к настройкам, указанным в https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html ).

AWS_S3_REGION_NAME = "ap-south-1"

Или до версии boto3 1.4.4:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

3

В Java мне пришлось установить свойство

System.setProperty(SDKGlobalConfiguration.ENFORCE_S3_SIGV4_SYSTEM_PROPERTY, "true")

и добавьте регион в экземпляр s3Client.

s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))

3

С boto3 это код:

s3_client = boto3.resource('s3', region_name='eu-central-1')

или

s3_client = boto3.client('s3', region_name='eu-central-1')

у тебя s3_client дважды?
MH

2

Для thumbor-aws, который использовал конфигурацию Boto, мне нужно было поместить это в $AWS_CONFIG_FILE

[default]
aws_access_key_id = (your ID)
aws_secret_access_key = (your secret key)
s3 =
    signature_version = s3

Таким образом, все, что использовало boto напрямую, без изменений, может быть полезно


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

это также сэкономило мне время после серфинга в течение 24 часов ..


Это отлично работает, вам просто нужно изменить название региона в соответствии с вашим, если это не «ap-south-1»
Девман

Изменять кодировку не нужно! Установите эти две переменные env, и бото будет работать
нормально

1

Для Android SDK проблему решает setEndpoint, хотя она устарела.

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                context, "identityPoolId", Regions.US_EAST_1);
AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
s3.setEndpoint("s3.us-east-2.amazonaws.com");

1

В основном ошибка возникла из-за того, что я использовал старую версию aws-sdk и обновил ее, поэтому возникла эта ошибка.

в моем случае с node js я использовал signatureVersionв объекте parmas вот так:

const AWS_S3 = new AWS.S3({
  params: {
    Bucket: process.env.AWS_S3_BUCKET,
    signatureVersion: 'v4',
    region: process.env.AWS_S3_REGION
  }
});

Затем я поставил подпись из объекта params и работал как шарм:

const AWS_S3 = new AWS.S3({
  params: {
    Bucket: process.env.AWS_S3_BUCKET,
    region: process.env.AWS_S3_REGION
  },
  signatureVersion: 'v4'
});

1

Проверьте AWS S3 Bucket области и Передайте соответствующий регион в запросе подключения.

В My Senario я установил « APSouth1 » для Азиатско-Тихоокеанского региона (Мумбаи)

using (var client = new AmazonS3Client(awsAccessKeyId, awsSecretAccessKey, RegionEndpoint.APSouth1))
{
    GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest
    {
        BucketName = bucketName,
        Key = keyName,
        Expires = DateTime.Now.AddMinutes(50),
    };
    urlString = client.GetPreSignedURL(request1);
}

1

Для Boto3 используйте этот код.

import boto3
from botocore.client import Config


s3 = boto3.resource('s3',
        aws_access_key_id='xxxxxx',
        aws_secret_access_key='xxxxxx',
        region_name='us-south-1',
        config=Config(signature_version='s3v4')
        )


0

Иногда версия по умолчанию не обновляется. Добавьте эту команду

AWS_S3_SIGNATURE_VERSION = "s3v4"

в settings.py


0

Попробуйте эту комбинацию.

const s3 = new AWS.S3({
  endpoint: 's3-ap-south-1.amazonaws.com',       // Bucket region
  accessKeyId: 'A-----------------U',
  secretAccessKey: 'k------ja----------------soGp',
  Bucket: 'bucket_name',
  useAccelerateEndpoint: true,
  signatureVersion: 'v4',
  region: 'ap-south-1'             // Bucket region
});

0

Код для Flask (boto3)

Не забудьте импортировать Config. Также, если у вас есть собственный класс конфигурации, измените его имя.

from botocore.client import Config

s3 = boto3.client('s3',config=Config(signature_version='s3v4'),region_name=app.config["AWS_REGION"],aws_access_key_id=app.config['AWS_ACCESS_KEY'], aws_secret_access_key=app.config['AWS_SECRET_KEY'])
s3.upload_fileobj(file,app.config["AWS_BUCKET_NAME"],file.filename)
url = s3.generate_presigned_url('get_object', Params = {'Bucket':app.config["AWS_BUCKET_NAME"] , 'Key': file.filename}, ExpiresIn = 10000)

0

Ответ Supernova для django / boto3 / django-storerages работал со мной:

AWS_S3_REGION_NAME = "ap-south-1"

Или до версии boto3 1.4.4:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

просто добавьте их в свой settings.py и соответствующим образом измените код региона

вы можете проверить регионы AWS: введите описание ссылки здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.