Der von Ihnen bereitgestellte Autorisierungsmechanismus wird nicht unterstützt. Bitte verwenden Sie AWS4-HMAC-SHA256


130

Ich erhalte eine Fehlermeldung, AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.wenn ich versuche, eine Datei in den S3-Bucket in der neuen Region Frankfurt hochzuladen. Alles funktioniert einwandfrei mitUS Standard Region.

Skript:

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)

Wie man es repariert?

Danke dir.


1
Diese Antwort löste mein Problem: stackoverflow.com/questions/34483795/…
Bahadir Tasdemir

Antworten:


151

AWS4-HMAC-SHA256, auch als Signaturversion 4 ("V4") bekannt, ist eines von zwei von S3 unterstützten Authentifizierungsschemata.

Alle Regionen unterstützen V4, aber US-Standard¹, und viele - aber nicht alle - andere Regionen unterstützen auch das andere, ältere Schema, Signature Version 2 ("V2").

Laut http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... werden neue S3-Regionen, die nach Januar 2014 bereitgestellt wurden, nur V4 unterstützen.

Da Frankfurt Ende 2014 eingeführt wurde, wird V2 nicht unterstützt. Dieser Fehler deutet darauf hin, dass Sie es verwenden.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html erläutert, wie Sie V4 in den verschiedenen SDKs aktivieren, vorausgesetzt, Sie verwenden ein SDK mit dieser Funktion.

Ich würde spekulieren, dass einige ältere Versionen der SDKs diese Option möglicherweise nicht unterstützen. Wenn dies nicht hilft, benötigen Sie möglicherweise eine neuere Version des von Ihnen verwendeten SDK.


¹ US Standardist der frühere Name für die regionale Bereitstellung von S3 in der us-east-1Region. Seit der ursprünglichen Erstellung dieser Antwort wurde "Amazon S3 die US-Standardregion in die Region US-Ost (N. Virginia) umbenannt, um den regionalen Namenskonventionen von AWS zu entsprechen." Für alle praktischen Zwecke ist es nur eine Änderung der Benennung.


Dies stumpft s3cmd-1.5.0-0.alpha3.fc20.noarch, das mit Fedora 20 geliefert wird. Und anscheinend stumpft auch 1.5.0-rc1 , das neueste für jetzt.
David Tonhofer

1
@ DavidTonhofer das scheint richtig. Es sieht so aus, als hätten die s3cmd-Entwickler noch nichts AWS4-HMAC-SHA256implementiert: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot

2
@ "Michael - sqlbot" Nun, ich habe vorerst zu "awscli" gewechselt. Für diejenigen, die es eilig haben: yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET etc ...
David Tonhofer

aws-sdk v2 scheint die AWS4-HMAC-SHA256 "V4" -Authentifizierung gut zu unterstützen (verwandtes Problem )
Jeewes

Danke .. das ist nützlich für mich
Manish Vadher

68

Versuchen Sie es mit Node

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

34

Sie sollten setzen signatureVersion: 'v4'in configneue Zeichen Version zu verwenden:

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

Funktioniert für JSSDK.


3
Rettete meinen Tag! Nicht sicher, warum diese Option nicht mehr bekannt gemacht wird
André Werlang

26

Verwenden Sie für Benutzer von boto3( Python SDK) den folgenden Code

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
Ich erhalte eine Fehlermeldung AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Also habe ich region_name='us-east-2' den obigen Code hinzugefügt
Aseem

13

Ähnliches Problem mit dem PHP SDK, dies funktioniert:

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

Das Wichtige ist das signatureund dasregion


Muss die Region angegeben werden?
Chirag Mehta


3

In Java musste ich eine Eigenschaft festlegen

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

und fügen Sie die Region der s3Client-Instanz hinzu.

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

3

Bei boto3 ist dies der Code:

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

oder

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

du hast s3_client zweimal?
MH

2

Für thumbor-aws, die boto config verwendeten, musste ich dies auf die setzen $AWS_CONFIG_FILE

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

Alles, was Boto direkt ohne Änderungen verwendet hat, kann nützlich sein


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

Dies sparte mir auch Zeit nach dem 24-stündigen Surfen.


Dies funktioniert hervorragend, Sie müssen nur den Namen der Region ändern, um ihn an Ihre
anzupassen,

Keine Codierungsänderungen notwendig! Stellen Sie diese beiden Umgebungsvariablen ein und boto wird gut funktionieren
Stevko

1

Für Android SDK löst setEndpoint das Problem, obwohl es veraltet ist.

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

1

Grundsätzlich lag der Fehler daran, dass ich die alte Version von aws-sdk verwendet und die Version aktualisiert habe, sodass dieser Fehler auftrat.

in meinem Fall mit Knoten js habe ich signatureVersionin parmas Objekt wie folgt verwendet:

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

Dann habe ich die Signatur aus dem params-Objekt entfernt und wie ein Zauber gearbeitet:

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

1

Überprüfen Sie Ihre AWS S3-Bucket- Region und übergeben Sie die richtige Region in der Verbindungsanforderung.

In My Senario habe ich ' APSouth1 ' für den asiatisch-pazifischen Raum (Mumbai) eingestellt.

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

Verwenden Sie für Boto3 diesen Code.

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

Manchmal wird die Standardversion nicht aktualisiert. Fügen Sie diesen Befehl hinzu

AWS_S3_SIGNATURE_VERSION = "s3v4"

im settings.py


0

Versuchen Sie diese Kombination.

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

Code für Flasche (boto3)

Vergessen Sie nicht, Config zu importieren. Wenn Sie eine eigene Konfigurationsklasse haben, ändern Sie deren Namen.

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.