Il meccanismo di autorizzazione fornito non è supportato. Si prega di utilizzare AWS4-HMAC-SHA256


130

Viene visualizzato un errore AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.quando provo a caricare il file sul bucket S3 nella nuova regione di Francoforte. Tutto funziona correttamente con la US Standardregione.

script:

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)

Come sistemarlo?

Grazie.


1
Questa risposta ha risolto il mio problema: stackoverflow.com/questions/34483795/...
Bahadir Tasdemir

Risposte:


151

AWS4-HMAC-SHA256, noto anche come Signature Version 4, ("V4") è uno dei due schemi di autenticazione supportati da S3.

Tutte le regioni supportano V4, ma US-Standard¹ e molte, ma non tutte, altre regioni, supportano anche l'altro schema precedente, Signature Version 2 ("V2").

Secondo http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... le nuove regioni S3 distribuite dopo gennaio 2014 supporteranno solo V4.

Da quando Francoforte è stata introdotta alla fine del 2014, non supporta V2, che è ciò che questo errore suggerisce che si sta utilizzando.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html spiega come abilitare V4 nei vari SDK, supponendo che si stia utilizzando un SDK con tale funzionalità.

Vorrei ipotizzare che alcune versioni precedenti degli SDK potrebbero non supportare questa opzione, quindi se quanto sopra non aiuta, potresti aver bisogno di una versione più recente dell'SDK che stai utilizzando.


¹ US Standardè il nome precedente per la distribuzione regionale S3 basata nella us-east-1regione. Dal momento in cui questa risposta è stata scritta originariamente, "Amazon S3 ha ribattezzato la regione standard degli Stati Uniti nella regione degli Stati Uniti orientali (Virginia settentrionale) per essere coerente con le convenzioni di denominazione regionali AWS". A tutti gli effetti pratici, è solo un cambiamento nella denominazione.


Questo monta s3cmd-1.5.0-0.alpha3.fc20.noarch che viene fornito con Fedora 20. E apparentemente monta anche 1.5.0-rc1 , l'ultimo per ora.
David Tonhofer,

1
@DavidTonhofer che sembra giusto. Sembra che gli sviluppatori di s3cmd non abbiano AWS4-HMAC-SHA256ancora implementato: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot

2
@ "Michael - sqlbot" bene sono passato a "awscli" per ora. Per chi ha fretta: installa yum python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET etc ...
David Tonhofer

aws-sdk v2 sembra supportare bene l'autenticazione AWS4-HMAC-SHA256 "V4" ( problema correlato )
Jeewes,

grazie .. questo è utile per me
Manish Vadher

68

Con nodo, prova

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

34

È necessario impostare signatureVersion: 'v4'a configutilizzare la nuova versione segno:

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

Funziona per JSSDK.


3
Mi hai salvato la giornata! Non sono sicuro del perché questa opzione non sia più pubblicizzata
André Werlang,

26

Per le persone che utilizzano boto3( Python SDK) utilizzare il codice seguente

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
Ottengo l'errore AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Quindi ho aggiunto region_name='us-east-2' il codice sopra
Aseem,

13

Problema simile con l'SDK di PHP, funziona:

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

L'importante è il signaturee ilregion


È necessario specificare la regione?
Chirag Mehta,


3

In Java ho dovuto impostare una proprietà

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

e aggiungi la regione all'istanza s3Client.

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

3

Con boto3, questo è il codice:

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

o

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

hai s3_client due volte?
MH,

2

Per i thumbor-aws, che usavano la configurazione di boto, dovevo metterlo al $AWS_CONFIG_FILE

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

Quindi tutto ciò che ha usato boto direttamente senza modifiche, questo può essere utile


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

anche questo mi ha permesso di risparmiare tempo dopo aver navigato per 24 ore ..


Funziona benissimo, devi solo cambiare il nome della regione per adattarlo al tuo se non è "ap-sud-1"
Devman

Non sono necessarie modifiche alla codifica! Imposta questi due env var e il boto funzionerà bene
Stevko il

1

Per Android SDK, setEndpoint risolve il problema, sebbene sia stato deprecato.

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

1

Fondamentalmente l'errore era perché stavo usando la vecchia versione di aws-sdk e ho aggiornato la versione in modo che si sia verificato questo errore.

nel mio caso con il nodo js stavo usando signatureVersionnell'oggetto parmas in questo modo:

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

Quindi ho messo la firma fuori dall'oggetto params e ho funzionato come per incanto:

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

1

Controlla la tua regione benna AWS S3 e passa la regione corretta nella richiesta di connessione.

In My Senario ho impostato ' APSouth1 ' per Asia Pacifico (Mumbai)

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

Per Boto3, utilizzare questo codice.

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

A volte la versione predefinita non verrà aggiornata. Aggiungi questo comando

AWS_S3_SIGNATURE_VERSION = "s3v4"

nel settings.py


0

Prova questa combinazione.

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

Codice per pallone (boto3)

Non dimenticare di importare Config. Inoltre, se hai la tua classe di configurazione, allora cambia il suo nome.

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.