Podany przez Ciebie mechanizm autoryzacji nie jest obsługiwany. Użyj AWS4-HMAC-SHA256


135

AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.Podczas próby przesłania pliku do zasobnika S3 w nowym regionie Frankfurtu pojawia się błąd . Wszystko działa poprawnie z US Standardregionem.

Scenariusz:

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)

Jak to naprawić?

Dziękuję Ci.


1
Ta odpowiedź rozwiązała mój problem: stackoverflow.com/questions/34483795/ ...
Bahadir Tasdemir

Odpowiedzi:


155

AWS4-HMAC-SHA256, znany również jako Signature Version 4 („V4”) to jeden z dwóch schematów uwierzytelniania obsługiwanych przez S3.

Wszystkie regiony obsługują V4, ale US-Standard¹ i wiele - ale nie wszystkie - inne regiony obsługują również inny, starszy schemat, Signature Version 2 („V2”).

Według http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... nowe regiony S3 wdrożone po styczniu 2014 będą obsługiwać tylko V4.

Ponieważ Frankfurt został wprowadzony pod koniec 2014 roku, nie obsługuje V2, co sugeruje ten błąd.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html wyjaśnia, jak włączyć V4 w różnych pakietach SDK, zakładając, że używasz zestawu SDK, który ma taką możliwość.

Spekuluję, że niektóre starsze wersje SDK mogą nie obsługiwać tej opcji, więc jeśli powyższe nie pomoże, możesz potrzebować nowszej wersji SDK, którego używasz.


¹ US Standardto dawna nazwa regionalnego wdrożenia S3 zlokalizowanego w us-east-1regionie. Od czasu, gdy ta odpowiedź została pierwotnie napisana, „Amazon S3 zmienił nazwę Standardowego Regionu USA na Region Wschodni Stanów Zjednoczonych (Północna Wirginia), aby zachować zgodność z regionalnymi konwencjami nazewnictwa AWS”. Ze względów praktycznych jest to tylko zmiana w nazewnictwie.


Ten pniak s3cmd-1.5.0-0.alpha3.fc20.noarch, który jest dostarczany z Fedorą 20. I najwyraźniej także pnie 1.5.0-rc1 , na razie najnowszy.
David Tonhofer

1
@DavidTonhofer wydaje się słuszne. Wygląda na to, że programiści s3cmd jeszcze nie AWS4-HMAC-SHA256zaimplementowali: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot

2
@ "Michael - sqlbot" na razie przełączyłem się na "awscli". Dla tych, którzy się spieszą: yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET itp ...
David Tonhofer

Wygląda na to, że aws-sdk v2 ładnie obsługuje uwierzytelnianie AWS4-HMAC-SHA256 „V4” (powiązany problem )
Jeewes

dzięki .. to jest dla mnie przydatne
Manish Vadher

72

W przypadku węzła spróbuj

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

36

Należy ustawić signatureVersion: 'v4'na configużycie nowej wersji znak:

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

Działa dla JSsdk.


3
Uratowałem mój dzień! Nie jestem pewien, dlaczego ta opcja nie jest bardziej nagłośniona
André Werlang

27

Dla osób używających boto3( Python SDK) użyj poniższego kodu

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
Otrzymuję błąd, AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 więc dodałem region_name='us-east-2' do powyższego kodu
Aseem


13

Podobny problem z PHP SDK, to działa:

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

Ważne jest to, że signatureiregion


Czy wymagane jest określenie regionu?
Chirag Mehta

4
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

to również zaoszczędziło mi czasu po surfowaniu przez 24 godziny.


To działa świetnie, wystarczy zmienić nazwę regionu na swoją, jeśli nie jest to „ap-south-1”
Mathews Musukuma

Żadne zmiany w kodowaniu nie są konieczne! Ustaw te dwie
zmienne

3

W Javie musiałem ustawić właściwość

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

i dodaj region do instancji s3Client.

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

3

W przypadku boto3 jest to kod:

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

lub

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

masz s3_client dwa razy?
PolarBear10

2

W przypadku thumbor-aws, które używały konfiguracji boto, musiałem umieścić to w pliku $AWS_CONFIG_FILE

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

Więc wszystko, co korzystało bezpośrednio z Boto bez zmian, może być przydatne


1

W przypadku zestawu SDK systemu Android setEndpoint rozwiązuje problem, chociaż jest przestarzały.

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

1

Zasadniczo błąd był spowodowany tym, że używałem starej wersji aws-sdk i zaktualizowałem wersję, więc ten błąd wystąpił.

w moim przypadku z node js, którego signatureVersionużywałem w obiekcie Parmas w następujący sposób:

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

Potem umieściłem podpis z obiektu params i zadziałałem jak czar:

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

1

Sprawdź region wiadra AWS S3 i podaj odpowiedni region w żądaniu połączenia.

W My Senario ustawiłem „ APSouth1 ” dla Azji i Pacyfiku (Bombaj)

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

W przypadku Boto3 użyj tego kodu.

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')
        )

1

Kod dla Flask (boto3)

Nie zapomnij zaimportować Config. Jeśli masz własną klasę konfiguracyjną, zmień jej nazwę.

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)


1

Odpowiedź Supernova dla django / boto3 / django-storages działała ze mną:

AWS_S3_REGION_NAME = "ap-south-1"

Lub poprzednia wersja boto3 1.4.4:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = „s3v4”

po prostu dodaj je do swojego settings.py i odpowiednio zmień kod regionu

możesz sprawdzić regiony aws z: wprowadź opis linku tutaj


0

Czasami domyślna wersja nie zostanie zaktualizowana. Dodaj to polecenie

AWS_S3_SIGNATURE_VERSION = "s3v4"

w settings.py


0

Wypróbuj tę kombinację.

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

Utknąłem na 3 dni iw końcu po przeczytaniu mnóstwa blogów i odpowiedzi udało mi się skonfigurować Amazon AWS S3 Bucket.

Po stronie AWS

Zakładam, że już to zrobiłeś

  1. Utworzono wiadro s3
  2. Utworzono użytkownika w IAM

Kroki

  1. Skonfiguruj ustawienia CORS

    masz wiadro> uprawnienia> konfiguracja CORS

    <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    </CORSConfiguration>```
    
    
  2. Wygeneruj zasady zasobnika

twój zasobnik> uprawnienia> zasady zasobnika

Powinien być podobny do tego

 {
     "Version": "2012-10-17",
     "Id": "Policy1602480700663",
     "Statement": [
         {
             "Sid": "Stmt1602480694902",
             "Effect": "Allow",
             "Principal": "*",
             "Action": "s3:GetObject",
             "Resource": "arn:aws:s3:::harshit-portfolio-bucket/*"
         }
     ]
 }
PS: Bucket policy should say `public` after this 
  1. Skonfiguruj listę kontroli dostępu

twój zasobnik> uprawnienia> lista kontroli dostępu

dać publiczny dostęp

PS: Lista kontroli dostępu powinna powiedzieć publicpo tym

  1. Odblokuj dostęp publiczny

Twój zasobnik> uprawnienia> Zablokuj dostęp publiczny

Edytuj i wyłącz wszystkie opcje

** Na marginesie, jeśli pracujesz na django, dodaj następujące linie do settings.pypliku swojego projektu **

#S3 BUCKETS CONFIG

AWS_ACCESS_KEY_ID = '****not to be shared*****'
AWS_SECRET_ACCESS_KEY = '*****not to be shared******'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'

AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# look for files first in aws 
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# In India these settings work
AWS_S3_REGION_NAME = "ap-south-1"
AWS_S3_SIGNATURE_VERSION = "s3v4"

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.