使用服务器端加密和来自iPhone应用程序的ASIHTTPRequest时出现无效的S3签名错误

时间:2011-12-06 23:50:31

标签: iphone amazon-s3 asihttprequest

我有一段时间使用的iPhone应用程序使用ASIHTTPRequest将视频上传到Amazon S3上的存储桶。它一直运作良好,没有任何问题。最近,我们决定利用亚马逊实施的新“服务器端加密”。这允许您通过包含额外的HTTP请求标头来告知Amazon的服务器自动加密已发布到存储桶的文件。

我在我的应用程序中添加了一行代码来实现这一点,但现在我的亚马逊上传失败了。出现的具体错误消息是:

“我们计算的请求签名与您提供的签名不符。请检查您的密钥和签名方法。”

我使用的存储桶名称符合亚马逊的命名标准,因此我相信这不是问题所在。我也相信我使用的秘密和公钥是正确的。

似乎添加此标题会以某种方式破坏签名计算,我假设因为它被包含在传输一侧的计算中但不包含在另一侧。

我做错了吗?或者这是ASIHTTPRequest中的错误?

以下是我的参考代码:

[ASIS3Request setSharedSecretAccessKey:@"mysecretkey"];
[ASIS3Request setSharedAccessKey:@"myaccesskey"];

NSString *bucketPath = [NSString stringWithFormat:@"mypath/filename"];

ASIS3ObjectRequest *request = [ASIS3ObjectRequest PUTRequestForFile:filepath withBucket:@"my-bucket" key:bucketPath];

// If the following line is commented, the upload completes successfully
[request addRequestHeader:@"x-amz-server-side-encryption" value:@"AES256"];
////

request.requestScheme = ASIS3RequestSchemeHTTPS;
[request setShouldContinueWhenAppEntersBackground:YES];
[request startSynchronous];

if ([request error])
{
  // The error messag is being displayed here
  NSLog(@"xmit error: [%@]",[[request error] localizedDescription]);
}

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,但是我没有使用加密。但到目前为止我发现大写字母的签名是错误的。

在我的情况下,我使用ASIS3StorageClassReducedRedundancy设置存储类,其值为@"REDUCED_REDUNDANCY",为大写。如果我没有设置此选项,则请求会成功。

所以也许你的问题是值AES256有大写字母。

答案 1 :(得分:0)

您正在做的一切正确,问题是构建Authorization标头(即“请求签名”)涉及signing a string,其中包含所有x-amz-标头;你添加了一个这样的标题(x-amz-server-side-encryption),但你没有将它作为签名中的因素。

我刚刚创建了a branch of ASIHTTPRequest with support for SSE。如果您使用该分支,您应该只能说[request setUseServerSideEncryption:YES];。或者,如果您对该技术更感兴趣,请here are the details of making it work