使用AWS S3 createPresignedPost结合KMS加密时遇访问拒绝问题
AWS S3 预签名POST结合KMS加密时遭遇AccessDenied问题
问题背景
已找到Java实现AWS S3 createPresignedPost结合KMS加密的官方文档,以及少量面向JavaScript开发者的零散参考,但始终遭遇AWS的AccessDenied错误,尝试过多种配置变体仍未解决。开发环境为专有框架,后台处理大部分角色与凭证逻辑,已确定KMS策略是核心问题点,但尚未找到解决方案。
已尝试的配置
签名参数配置
曾在签名过程中传入以下参数:
const params = { Bucket: targetBucket, ServerSideEncryption: 'aws:kms', SSEKMSKeyId: keyId, Conditions: [{ acl: 'private' }, { key: filepath } ] }; return new Promise((res, rej) => { clientS3.createPresignedPost(params, (err, data) => { if (err) { console.log(err.message); rej(err); } else { console.log(data); res({ data, filepath, encryption, bucket }); } }); });
无效,仍提示AccessDenied(已将相关值包含在formdata中确保签名请求正确)。
请求头部配置
还尝试在POST请求中添加头部:
return axios .post(response.data.url, formData, { headers: { 'Content-Type': 'multipart/form-data', 'x-amz-server-side-encryption-aws-kms-key-id': response.encryption, 'x-amz-server-side-encryption-context': bucketArn }, ....
依旧返回AccessDenied。混合多种方法只会破坏签名导致更糟的结果,始终无法完成加密文件上传,也未找到相关文档。
更新信息1
已验证访问角色具备KMS的Encrypt及GenerateDataKey权限,且移除桶的加密策略后可正常上传。对应的桶策略如下:
{ "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::[[ bucket name ]]/*", "Condition": { "StringNotLikeIfExists": { "s3:x-amz-server-side-encryption-aws-kms-key-id": "[[ kms arn ]]" } } }
更新信息2
添加x-amz-server-side-encryption: aws:kms头部后问题仍未解决,完整请求头部如下:
Accept: application/json, text/plain, */* Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9 Connection: keep-alive Content-Length: 307546 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4B20k5OmUGzGhYoV Host: s3.us-west-2.amazonaws.com Origin: http://localhost:8888 Referer: http://localhost:8888/ sec-ch-ua: "Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "macOS" Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: cross-site User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 x-amz-server-side-encryption: aws:kms x-amz-server-side-encryption-aws-kms-key-id: [[ full arn of kms key ]] x-amz-server-side-encryption-context: arn:aws:s3:::[[ bucket name ]]/*
响应头部
Request URL: https://s3.us-west-2.amazonaws.com/[[ bucket name ]] Request Method: POST Status Code: 403 Forbidden Remote Address: 52.92.145.80:443 Referrer Policy: strict-origin-when-cross-origin Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Origin: http://localhost:8888 Connection: close Content-Type: application/xml Date: Mon, 05 Dec 2022 02:07:11 GMT Server: AmazonS3 Transfer-Encoding: chunked Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method x-amz-id-2: [[ ugly amz string ]] x-amz-request-id: [[ shorter amz string ]]
响应负载
<?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied</Message>. <RequestId>[[ same as header request id ]]</RequestId>. <HostId>[[ same as long amz id in headers ]] </HostId></Error>
FormData负载
acl: private key: [[ filename ]] bucket: [[ bucket ]] X-Amz-Algorithm: AWS4-HMAC-SHA256 X-Amz-Credential: [[credential string ]] X-Amz-Date: 20221205T020711Z X-Amz-Security-Token: [[ token ]] Policy: [[ policy string ]] X-Amz-Signature: [[ signature string ]] file: (binary)
内容的提问来源于stack exchange,提问作者Blunt Jackson
相关产品推荐
相关产品推荐

