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

已配置S3v4签名仍报错:AWS KMS托管密钥需SigV4签名排查

问题分析与解决:S3 KMS加密文件下载签名版本错误

错误信息

api error InvalidArgument: Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.

你的代码

var getFileContent = func(ctx context.Context, s3Details S3Details, key string) (*manager.WriteAtBuffer, error) {
    client := getS3Client(s3Details)

    head, headerr := client.HeadObject(ctx, &s3.HeadObjectInput{Bucket: &s3Details.Bucket, Key: &key})
    if headerr != nil {
        return nil, headerr
    }

    buff := manager.NewWriteAtBuffer(make([]byte, 0, head.ContentLength))

    _, err := manager.NewDownloader(client).Download(ctx, buff, &s3.GetObjectInput{
        Bucket: aws.String(s3Details.Bucket),
        Key:    aws.String(key),
    })

    return buff, err
}

func getS3Client(s3Details S3Details) *s3.Client {
    endpointResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
        endpoint := aws.Endpoint{
            PartitionID:   "aws",
            SigningRegion: s3Details.Region,
            SigningMethod: s3Details.SignatureVersion,
        }

        if s3Details.EndpointUrl != "" {
            endpoint.URL = s3Details.EndpointUrl
            return endpoint, nil
        } else {
            return endpoint, &aws.EndpointNotFoundError{}
        }
    })

    cfg, _ := config.LoadDefaultConfig(context.TODO(),
        config.WithEndpointDiscovery(aws.EndpointDiscoveryEnabled),
        config.WithEndpointResolverWithOptions(endpointResolver))

    return s3.NewFromConfig(cfg, func(o *s3.Options) {
        o.Region = s3Details.Region
        o.Credentials = aws.AnonymousCredentials{}
        o.UsePathStyle = true
    })
}

问题根源与修复方案

1. 匿名凭证导致签名失效

你设置了o.Credentials = aws.AnonymousCredentials{},这会让所有请求以匿名方式发送,不会生成任何签名。而KMS加密的S3对象强制要求使用Signature Version 4的签名请求,匿名请求完全不符合这个要求,这是核心问题。

修复:移除该行代码,让SDK使用默认的凭证链(环境变量、IAM角色、本地~/.aws/credentials文件等),确保请求能生成合法的v4签名。

2. 签名版本配置方式错误

aws-sdk-go-v2中,Signature Version 4是默认签名算法,不需要手动在Endpoint中设置SigningMethod。你传入的s3v4并不是SDK认可的合法取值,正确的v4签名方法标识是v4。

如果确实需要明确指定签名版本,建议通过配置SigningResolver实现,而不是在Endpoint中设置:

cfg, _ := config.LoadDefaultConfig(context.TODO(),
    config.WithEndpointDiscovery(aws.EndpointDiscoveryEnabled),
    config.WithEndpointResolverWithOptions(endpointResolver),
    config.WithSigningResolver(func(options signing.SigningOptions) (signing.Algorithm, error) {
        return signing.AlgorithmV4, nil
    }))

3. 额外验证点

  • 确认你的IAM身份拥有s3:GetObject权限,以及对应的KMS权限(kms:Decrypt),否则即使签名正确,也会被拒绝访问。
  • 确保s3Details.Region与存储桶所在区域一致,签名区域不匹配也会导致签名验证失败。

内容的提问来源于stack exchange,提问作者MeanwhileInHell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:45:34