0

我正在使用 awscli (S3 Api) 通过我的 softlayer 对象存储来操作一些请求。我可以检索存储桶列表、创建或删除存储桶。当我尝试将示例文件复制到特定存储桶时,出现错误: aws --endpoint-url=https://s3-api.us-geo.objectstorage.softlayer.net s3 cp test.txt s3://my_test_bucket/files

我收到以下错误(使用 sdk api、python boto3 api 和 wascli 测试)

upload failed: ./test.txt to s3://my_test_bucket/test.txt An error occurred (SignatureDoesNotMatch) when calling the PutObject operation: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. For more information, see REST Authentication and SOAP Authentication for details.

4

2 回答 2

1

这很奇怪 - 您似乎使用了正确的语法。你是如何传递你的凭据的?最简单的方法是在包含以下内容的~/.aws/credentials文件中:

[default]
aws_access_key_id = {Access Key ID}
aws_secret_access_key = {Secret Access Key}

如果您在不同的工具/库中遇到相同的错误,这可能是问题所在。如果您的凭据设置正确并且仍然遇到签名问题,我们可能需要更深入地了解发生了什么,因为看起来您没有做任何不正确的事情。

于 2017-01-13T17:03:22.257 回答
0

您收到错误的原因可能是签名版本不同。
IBM Cloud Object Storage 使用签名版本 2,但默认版本为 4。 http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html

我不确定如何通过 curl 和 python 设置签名版本。
在 SDK for Java 中需要这样设置,否则会报错。

AWSCredentialsProvider provider = loadCredentialProvider();

ClientConfiguration config = new ClientConfiguration();
config.withSignerOverride("S3SignerType");

// second arg region not needed
EndpointConfiguration endpointConfiguration = 
        new EndpointConfiguration(us-geo.objectstorage.softlayer.net, "");

AmazonS3 cos = AmazonS3ClientBuilder.standard()
        .withCredentials(provider)
        .withClientConfiguration(config)
        .withEndpointConfiguration(endpointConfiguration)
        .build();
于 2017-06-23T21:22:11.860 回答