我有一段时间使用的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]);
}
答案 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。