ไม่รองรับกลไกการให้สิทธิ์ที่คุณระบุ โปรดใช้ AWS4-HMAC-SHA256


130

ฉันได้รับข้อผิดพลาดAWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.เมื่อพยายามอัปโหลดไฟล์ไปยังถัง S3 ในภูมิภาคแฟรงค์เฟิร์ตใหม่ ทั้งหมดทำงานได้อย่างถูกต้องกับUS Standardภูมิภาค

สคริปต์:

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)

ต้องแก้ไขอย่างไร?

ขอบคุณ.


1
คำตอบนี้ช่วยแก้ปัญหาของฉัน: stackoverflow.com/questions/34483795/…
Bahadir Tasdemir

คำตอบ:


151

AWS4-HMAC-SHA256 หรือที่เรียกว่า Signature Version 4 ("V4") เป็นหนึ่งในสองรูปแบบการตรวจสอบสิทธิ์ที่ S3 รองรับ

ทุกภูมิภาครองรับ V4 แต่ US-Standard¹และภูมิภาคอื่น ๆ อีกมากมาย - แต่ไม่ใช่ทั้งหมด - ภูมิภาคอื่น ๆ ยังรองรับรูปแบบอื่น ๆ ที่เก่ากว่า Signature Version 2 ("V2")

อ้างอิงจากhttp://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... ภูมิภาค S3 ใหม่ที่ใช้งานหลังเดือนมกราคม 2014 จะรองรับ V4 เท่านั้น

นับตั้งแต่แฟรงค์เฟิร์ตเปิดตัวเมื่อปลายปี 2557 จึงไม่รองรับ V2 ซึ่งเป็นข้อผิดพลาดนี้บ่งชี้ว่าคุณกำลังใช้

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.htmlอธิบายวิธีเปิดใช้งาน V4 ใน SDK ต่างๆโดยสมมติว่าคุณใช้ SDK ที่มีความสามารถดังกล่าว

ฉันคาดเดาว่า SDK เวอร์ชันเก่าบางรุ่นอาจไม่รองรับตัวเลือกนี้ดังนั้นหากข้างต้นไม่ช่วยคุณอาจต้องใช้ SDK รุ่นใหม่กว่าที่คุณใช้อยู่


¹ US Standardเป็นชื่อเดิมของการปรับใช้ภูมิภาค S3 ที่ตั้งอยู่ในus-east-1ภูมิภาค ตั้งแต่ตอนแรกที่เขียนคำตอบนี้ "Amazon S3 เปลี่ยนชื่อภูมิภาคมาตรฐานของสหรัฐอเมริกาเป็นภูมิภาคสหรัฐอเมริกาฝั่งตะวันออก (เวอร์จิเนียเหนือ) เพื่อให้สอดคล้องกับรูปแบบการตั้งชื่อภูมิภาคของ AWS" เพื่อวัตถุประสงค์ในทางปฏิบัติทั้งหมดเป็นเพียงการเปลี่ยนแปลงในการตั้งชื่อเท่านั้น


ตอนี้ s3cmd-1.5.0-0.alpha3.fc20.noarch ซึ่งมาพร้อมกับ Fedora 20 และเห็นได้ชัดว่าตอ 1.5.0-rc1ซึ่งเป็นรุ่นล่าสุดสำหรับตอนนี้
David Tonhofer

1
@DavidTonhofer ที่ดูเหมือนถูกต้อง ดูเหมือนว่านักพัฒนา s3cmd ยังไม่ได้AWS4-HMAC-SHA256ติดตั้ง: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot

2
@ "Michael - sqlbot" ตอนนี้เปลี่ยนมาใช้ "awscli" แล้ว สำหรับผู้ที่เร่งรีบ: ยำติดตั้ง python-pip; pip ติดตั้ง awscli; กำหนดค่า aws; aws --region = eu-central-1 s3 ls s3: // $ BUCKET etc ...
David Tonhofer

aws-sdk v2 ดูเหมือนว่าจะรองรับการตรวจสอบสิทธิ์ AWS4-HMAC-SHA256 "V4" เป็นอย่างดี ( ปัญหาที่เกี่ยวข้อง)
Jeewes

ขอบคุณ .. สิ่งนี้มีประโยชน์สำหรับฉัน
Manish Vadher

68

ด้วยโหนดลอง

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

34

คุณควรตั้งค่า signatureVersion: 'v4'ในconfigการใช้งานรุ่นใหม่เข้าสู่ระบบ:

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

ใช้ได้กับJSsdk


3
บันทึกวันของฉัน! ไม่แน่ใจว่าเหตุใดตัวเลือกนี้จึงไม่ได้รับการเผยแพร่มากขึ้น
André Werlang

26

สำหรับผู้ที่ใช้boto3( Python SDK) ให้ใช้รหัสด้านล่าง

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
ฉันได้รับข้อผิดพลาดAuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 ดังนั้นฉันจึงเพิ่มregion_name='us-east-2' รหัสด้านบน
Aseem

13

ปัญหาที่คล้ายกันกับ PHP SDK ใช้งานได้:

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

บิตที่สำคัญคือsignatureและregion


จำเป็นต้องระบุภูมิภาคหรือไม่
Chirag Mehta

13

ฉันใช้ Django และฉันต้องเพิ่มตัวแปร config พิเศษเหล่านี้เพื่อให้มันใช้งานได้ (นอกเหนือจากการตั้งค่าที่กล่าวถึงในhttps://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html )

AWS_S3_REGION_NAME = "ap-south-1"

หรือก่อนหน้า boto3 เวอร์ชัน 1.4.4:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

3

ใน Java ฉันต้องตั้งค่าคุณสมบัติ

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

และเพิ่มภูมิภาคให้กับอินสแตนซ์ s3Client

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

3

ด้วย boto3 นี่คือรหัส:

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

หรือ

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

คุณมี s3_client สองครั้ง?
MH

2

สำหรับ thumbor-aws ที่ใช้ boto config ฉันต้องใส่สิ่งนี้ในไฟล์ $AWS_CONFIG_FILE

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

ดังนั้นอะไรก็ตามที่ใช้ boto โดยตรงโดยไม่มีการเปลี่ยนแปลงสิ่งนี้อาจเป็นประโยชน์


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

นอกจากนี้ยังช่วยประหยัดเวลาของฉันหลังจากท่องเว็บเป็นเวลา 24 ชั่วโมง ..


วิธีนี้ใช้งานได้ดีคุณเพียงแค่เปลี่ยนชื่อภูมิภาคให้เหมาะกับคุณหากไม่ใช่ "ap-south-1"
Devman

ไม่จำเป็นต้องเปลี่ยนแปลงการเข้ารหัส! ตั้งค่า env vars สองตัวนี้และ boto จะทำงานได้ดี
Stevko

1

สำหรับ Android SDK setEndpoint จะแก้ปัญหาได้แม้ว่าจะเลิกใช้แล้วก็ตาม

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

1

โดยทั่วไปข้อผิดพลาดเกิดจากฉันใช้ aws-sdk เวอร์ชันเก่าและฉันอัปเดตเวอร์ชันจึงเกิดข้อผิดพลาดนี้

ในกรณีของฉันกับโหนด js ฉันใช้signatureVersionในวัตถุ parmas เช่นนี้:

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

จากนั้นฉันใส่ลายเซ็นออกจากวัตถุ params และทำงานเหมือนมีเสน่ห์:

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

1

ตรวจสอบ AWS S3 Bucket Region ของคุณและผ่านภูมิภาคที่เหมาะสมในคำขอเชื่อมต่อ

ใน My Senario ฉันได้ตั้งค่า ' APSouth1 ' สำหรับเอเชียแปซิฟิก (มุมไบ)

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

สำหรับ Boto3 ให้ใช้รหัสนี้

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

ลองใช้ชุดค่าผสมนี้

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

รหัสสำหรับกระติกน้ำ (boto3)

อย่าลืมนำเข้า Config นอกจากนี้หากคุณมีคลาส config ของคุณเองให้เปลี่ยนชื่อ

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)

0

คำตอบ Supernova สำหรับ django / boto3 / django-storages ทำงานร่วมกับฉัน:

AWS_S3_REGION_NAME = "ap-south-1"

หรือก่อนหน้า boto3 เวอร์ชัน 1.4.4:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

เพียงเพิ่มใน settings.py ของคุณและเปลี่ยนรหัสภูมิภาคตามนั้น

คุณสามารถตรวจสอบภูมิภาค aws ได้จาก: ป้อนคำอธิบายลิงก์ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.