El mecanismo de autorización que ha proporcionado no es compatible. Utilice AWS4-HMAC-SHA256


130

Me da un error AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.cuando intento cargar el archivo en el depósito S3 en la nueva región de Frankfurt. Todo funciona correctamente con la US Standardregión.

Guión:

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)

¿Como arreglarlo?

Gracias.


1
Esta respuesta resolvió mi problema: stackoverflow.com/questions/34483795/…
Bahadir Tasdemir

Respuestas:


151

AWS4-HMAC-SHA256, también conocido como Signature Version 4, ("V4") es uno de los dos esquemas de autenticación compatibles con S3.

Todas las regiones admiten V4, pero US-Standard¹, y muchas otras regiones, pero no todas, también admiten el otro esquema anterior, Signature Version 2 ("V2").

Según http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... las nuevas regiones S3 implementadas después de enero de 2014 solo admitirán V4.

Desde que Frankfurt se introdujo a fines de 2014, no es compatible con V2, que es lo que este error sugiere que está utilizando.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html explica cómo habilitar V4 en los diversos SDK, suponiendo que esté utilizando un SDK que tenga esa capacidad.

Supondría que algunas versiones anteriores de los SDK podrían no ser compatibles con esta opción, por lo que si lo anterior no ayuda, es posible que necesite una versión más reciente del SDK que está utilizando.


¹ US Standardes el nombre anterior para la implementación regional S3 que se basa en la us-east-1región. Desde el momento en que esta respuesta se escribió originalmente, "Amazon S3 cambió el nombre de la Región Estándar de EE. UU. A la Región Este de EE. UU. (N. Virginia) para que fuera coherente con las convenciones de nombres regionales de AWS". A todos los efectos prácticos, es solo un cambio en la denominación.


Esto destruye s3cmd-1.5.0-0.alpha3.fc20.noarch que viene con Fedora 20. Y aparentemente también elimina 1.5.0-rc1 , lo último por ahora.
David Tonhofer

1
@DavidTonhofer que parece correcto. Parece que los desarrolladores de s3cmd aún no lo han AWS4-HMAC-SHA256implementado: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot

2
@ "Michael - sqlbot" bueno, cambié a "awscli" por ahora. Para aquellos que tienen prisa: yum instalar python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET etc ...
David Tonhofer

aws-sdk v2 parece ser compatible con la autenticación AWS4-HMAC-SHA256 "V4" ( problema relacionado )
Jeewes

gracias ... esto es útil para mí
Manish Vadher

68

Con el nodo, intente

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

34

Se debe ajustar signatureVersion: 'v4'en configutilizar una nueva versión del zodiaco:

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

Funciona para JSSDK.


3
Me salvó el día! No estoy seguro de por qué esta opción no es más publicitada
André Werlang

26

Para las personas que usan boto3( Python SDK) use el siguiente código

from botocore.client import Config


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

44
Recibo un error, AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 así que agregué region_name='us-east-2' el código anterior
Aseem

13

Problema similar con el SDK de PHP, esto funciona:

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

Lo importante es el signaturey elregion


¿Se requiere especificar la región?
Chirag Mehta


3

En Java tuve que establecer una propiedad

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

y agregue la región a la instancia de s3Client.

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

3

Con boto3, este es el código:

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

o

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

tienes s3_client dos veces?
MH

2

Para thumbor-aws, que usaba boto config, necesitaba poner esto en el $AWS_CONFIG_FILE

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

Entonces, cualquier cosa que use boto directamente sin cambios, esto puede ser útil


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

Esto también me ahorró tiempo después de navegar durante 24 horas.


Esto funciona muy bien, solo tienes que cambiar el nombre de la región para que se adapte al tuyo si no es "ap-south-1"
Devman

¡No se necesitan cambios de codificación! Establecer estos dos env vars y boto funcionará bien
Stevko

1

Para Android SDK, setEndpoint resuelve el problema, aunque ha quedado en desuso.

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

1

Básicamente, el error se debió a que estaba usando una versión anterior de aws-sdk y actualicé la versión, por lo que se produjo este error.

en mi caso con el nodo js que estaba usando signatureVersionen un objeto parmas como este:

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

Luego puse la firma del objeto params y trabajé como encanto:

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

1

Compruebe su AWS S3 Bucket Región y Región Pase adecuada en solicitud de conexión.

En My Senario configuré ' APSouth1 ' para Asia Pacífico (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

Para Boto3, use este código.

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

En algún momento, la versión predeterminada no se actualizará. Agrega este comando

AWS_S3_SIGNATURE_VERSION = "s3v4"

en settings.py


0

Prueba esta combinación.

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

Código para el matraz (boto3)

No olvides importar Config. Además, si tiene su propia clase de configuración, cambie su nombre.

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.