我有一个有效的直接浏览器上传表单,可以将文件从浏览器直接上传到 S3,包括通过上传策略和表单字段为每次上传启用服务器端加密for x-amz-server-side-encryption
。
问题在于 S3 端的存储桶策略对上传的文件强制执行服务器端加密。在没有存储桶策略的情况下,我的文件完美上传,并启用了服务器端加密。当我添加存储桶策略时,上传被拒绝并出现 HTTP 403 (AccessDenied) 错误。
这是我正在使用的完整存储桶策略(摘自亚马逊文档):
{
"Version": "2008-10-17",
"Id": "PutObjPolicy",
"Statement": [
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::MY-BUCKET-NAME/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
}
]
}
以下是在上传表单中签名和使用的策略(未编码和格式化)示例:
{
"expiration": "2013-04-14T14:29:56.000Z",
"conditions": [
{
"bucket": "MY-BUCKET-NAME"
},
{
"acl": "private"
},
{
"x-amz-server-side-encryption": "AES256"
},
[
"starts-with", "$key", "uploads/"
],
{
"success_action_status": "201"
}
]
}
为简洁起见,我将省略上传表单的详细信息,但可以说,它为x-amz-server-side-encryption
. 同样,这在没有存储桶策略的情况下有效,因此我相信客户端方面的情况良好。我的猜测是在这一点上,也许我应该专门允许某类 PUT,但我不确定要添加什么。
有任何想法吗?