相关疑难解决方法(0)

如何使用签名版本 4 生成 AWS S3 预签名 URL

我正在使用 AWSSDK.S3 (3.3.31.11) 在 C# .NET Core 2.0 API 控制器类中生成预签名 URL。生成的 URL 旨在供客户端 Angular 应用程序使用,以将文件上传到使用 SSE-KMS 加密的 S3 存储桶。尽管 S3Client 报告 SignatureMethod 为“HmacSHA256”且 SignatureVersion 为“4”,但当我尝试使用预签名 URL 上传文件时,我收到一条错误消息,指出“使用 AWS KMS 托管密钥指定服务器端加密的请求需要 AWS 签名版本 4。”

S3Client 作为控制器类的依赖项被注入。对象的实例化由 .NET Core DI 框架使用 config.json 文件中的配置设置进行管理:

{
    ...
    "AWS": {
        "Profile": "default",
        "Region": "us-east-1"
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 curl 测试预先签名的 URL:

curl -H "Content-Type: application/pdf" -H "x-amz-server-side-encryption: aws:kms" -H "x-amz-server-side-encryption-aws-kms-key-id: {kms-key-id}" -k -T "filename.pdf" "https://mybucketname.s3.amazonaws.com/filename.pdf?AWSAccessKeyId={keyid}&Expires={expires}&x-amz-security-token={token}&Signature={signature}"
Run Code Online (Sandbox Code Playgroud)

我发现如果我不包含“Content-Type”标头,我会收到“SignatureDoesNotMatch”错误代码,而不是“InvalidArgument”错误。

之前在对 S3 存储桶使用默认 AES-256 加密时,此过程一直在工作,只有在转换为 SSE-KMS 时,我才遇到此问题。

// Controller …
Run Code Online (Sandbox Code Playgroud)

c# amazon-s3 aws-sdk .net-core aws-kms

6
推荐指数
1
解决办法
5508
查看次数

标签 统计

.net-core ×1

amazon-s3 ×1

aws-kms ×1

aws-sdk ×1

c# ×1