您提供的授权机制不受支持。请使用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

Answers:


151

AWS4-HMAC-SHA256,也称为签名版本4(“ V4”),是S3支持的两种身份验证方案之一。

所有区域都支持V4,但美国标准¹,并且许多其他区域(但不是全部)也支持其他较旧的方案,即签名版本2(“ V2”)。

根据http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... 2014年1月之后部署的新S3区域仅支持V4。

自2014年晚些时候引入法兰克福以来,它不支持V2,这就是您使用此错误的提示。

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html说明了如何在各种SDK中启用V4(假设您正在使用具有该功能的SDK)。

我猜想某些旧版本的SDK可能不支持此选项,因此,如果以上方法没有帮助,则可能需要使用较新版本的SDK。


¹ US Standard是基于该us-east-1区域的S3区域部署的前称。自最初编写此答案以来, “ Amazon S3将美国标准地区重命名为美国东部(弗吉尼亚北部)地区,以符合AWS区域命名约定。” 出于所有实际目的,这只是命名上的更改。


这会遗留Fedora 20附带的s3cmd-1.5.0-0.alpha3.fc20.noarch,而且显然还会遗留目前最新的1.5.0-rc1
David Tonhofer 2014年

1
@DavidTonhofer似乎正确。看来s3cmd开发人员AWS4-HMAC-SHA256尚未实现: github.com/s3tools/s3cmd/issues/402
Michael-sqlbot 2014年

2
@“ Michael-sqlbot”好,我现在切换到“ awscli”。对于那些着急的人:yum install python-pip; pip install awscli; AWS配置; aws --region = eu-central-1 s3 ls s3:// $ BUCKET等...
David Tonhofer 2014年

aws-sdk v2似乎很好地支持AWS4-HMAC-SHA256“ V4”身份验证(相关问题
Jeewes 2015年

thnx ..这对我很有用
Manish Vadher

68

使用节点,尝试

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


26

对于使用boto3Python 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 '19

13

PHP SDK的类似问题,可以正常工作:

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

重要的是signatureregion


是否需要指定区域?
Chirag Mehta


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

对于使用boto config的thumb-aws,我需要将其放入 $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

无需更改编码!设置这两个环境变量,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对象中移出,并且像charm一样工作:

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

1

检查您的AWS S3存储桶区域,并在连接请求中传递正确的区域。

在我的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

有时默认版本不会更新。添加此命令

AWS_S3_SIGNATURE_VERSION = "s3v4"

settings.py


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。另外,如果您有自己的配置类,请更改其名称。

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.