Cơ chế ủy quyền bạn đã cung cấp không được hỗ trợ. Vui lòng sử dụng AWS4-HMAC-SHA256


130

Tôi gặp lỗi AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.khi thử tải tệp lên thùng S3 ở vùng Frankfurt mới. Tất cả hoạt động đúng với US Standardkhu vực.

Kịch bả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)

Làm thế nào để khắc phục nó?

Cảm ơn bạn.


1
Câu trả lời này đã giải quyết vấn đề của tôi: stackoverflow.com/questions
432483795 / Cách

Câu trả lời:


151

AWS4-HMAC-SHA256, còn được gọi là Phiên bản chữ ký 4, ("V4") là một trong hai sơ đồ xác thực được S3 hỗ trợ.

Tất cả các khu vực đều hỗ trợ V4, nhưng US-Standard¹, và nhiều khu vực - nhưng không phải tất cả - các khu vực khác, cũng hỗ trợ cho chương trình khác, phiên bản cũ hơn, Chữ ký Phiên bản 2 ("V2").

Theo http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... các khu vực S3 mới được triển khai sau tháng 1 năm 2014 sẽ chỉ hỗ trợ V4.

Vì Frankfurt được giới thiệu vào cuối năm 2014, nó không hỗ trợ V2, đây là lỗi mà bạn cho thấy bạn đang sử dụng.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html giải thích cách bật V4 trong các SDK khác nhau, giả sử bạn đang sử dụng SDK có khả năng đó.

Tôi sẽ suy đoán rằng một số phiên bản cũ hơn của SDK có thể không hỗ trợ tùy chọn này, vì vậy nếu cách trên không có ích, bạn có thể cần một bản phát hành SDK mới hơn mà bạn đang sử dụng.


¹ US Standardlà tên cũ cho việc triển khai trong khu vực S3 rằng có trụ sở tại us-east-1khu vực. Kể từ thời điểm câu trả lời này ban đầu được viết, "Amazon S3 đã đổi tên Vùng Tiêu chuẩn Hoa Kỳ thành Vùng Đông Hoa Kỳ (N. Virginia) để phù hợp với các quy ước đặt tên khu vực AWS." Đối với tất cả các mục đích thực tế, đó chỉ là một sự thay đổi trong cách đặt tên.


Cái này vấp ngã s3cmd-1.5.0-0.alpha3.fc20.noarch đi kèm với Fedora 20. Và rõ ràng cũng là stumps 1.5.0-rc1 , mới nhất cho đến nay.
David Tonhofer

1
@DavidTonhofer có vẻ đúng. Dường như các nhà phát triển s3cmd không đã AWS4-HMAC-SHA256thực hiện được nêu ra: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot

2
@ "Michael - sqlbot" bây giờ tôi đã chuyển sang "awscli". Đối với những người vội vàng: yum cài đặt python-pip; Pip cài đặt awscli; cấu hình aws;
aws --region

aws-sdk v2 dường như hỗ trợ xác thực AWS4-HMAC-SHA256 "V4" độc đáo ( vấn đề liên quan )
Jeewes 28/03/2015

thnx .. điều này hữu ích cho tôi
Manish Vadher 16/03/18

68

Với nút, hãy thử

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

34

Bạn nên đặt signatureVersion: 'v4'trong configsử dụng phiên bản dấu hiệu mới:

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

Hoạt động cho JSsdk.


3
Cứu ngày của tôi! Không chắc chắn tại sao tùy chọn này không được công bố rộng rãi hơn
André Werlang

26

Đối với những người sử dụng boto3( Python SDK) sử dụng mã dưới đây

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
Tôi gặp lỗi AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Vì vậy, tôi đã thêm vào region_name='us-east-2' đoạn mã trên
Aseem

13

Vấn đề tương tự với SDK PHP, điều này hoạt động:

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

Bit quan trọng là signatureregion


Là khu vực bắt buộc phải được chỉ định?
Chirag Mehta


3

Trong Java tôi đã phải thiết lập một thuộc tính

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

và thêm vùng vào thể hiện s3Client.

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

3

Với boto3, đây là mã:

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

hoặc là

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

bạn có s3_client hai lần?
MH

2

Đối với thumbor-aws, sử dụng cấu hình boto, tôi cần đặt cái này vào $AWS_CONFIG_FILE

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

Vì vậy, bất cứ điều gì sử dụng boto trực tiếp mà không thay đổi, điều này có thể hữu ích


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

điều này cũng tiết kiệm thời gian của tôi sau khi lướt web trong 24 giờ ..


Điều này hoạt động rất tốt, bạn chỉ cần thay đổi tên khu vực cho phù hợp với tên của bạn nếu không phải là "ap-south-1"
Devman

Không có thay đổi mã hóa cần thiết! Đặt hai vars env và boto này sẽ hoạt động tốt
Stevko

1

Đối với SDK Android, setEndpoint giải quyết vấn đề, mặc dù nó không được dùng nữa.

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

1

Về cơ bản lỗi là do tôi đang sử dụng phiên bản cũ của aws-sdk và tôi đã cập nhật phiên bản nên đã xảy ra lỗi này.

trong trường hợp của tôi với nút js tôi đã sử dụng signatureVersiontrong đối tượng parmas như thế này:

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

Sau đó, tôi đặt chữ ký ra khỏi đối tượng params và làm việc như bùa mê:

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

1

Kiểm tra Vùng Xô AWS S3 của bạn và Đạt Vùng thích hợp trong Yêu cầu kết nối.

Trong My Senario, tôi đã đặt ' APSouth1 ' cho Châu Á Thái Bình Dương (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

Đối với Boto3, sử dụng mã này.

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

Trong trường hợp của tôi, loại yêu cầu là sai. Tôi đã sử dụng GET (câm) Nó phải là PUT.


Lưu lại ngày của tôi, trong trường hợp của tôi, tôi đang sử dụng POST.
Shahid Kamal

0

Đôi khi phiên bản mặc định sẽ không cập nhật. Thêm lệnh này

AWS_S3_SIGNATURE_VERSION = "s3v4"

trong settings.py


0

Hãy thử sự kết hợp này.

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

Mã cho Flask (boto3)

Đừng quên nhập cấu hình. Ngoài ra Nếu bạn có lớp cấu hình của riêng bạn, sau đó thay đổi tên của nó.

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.