You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:30:29