.net - 使用 KMS 加密为 S3 对象生成预签名 URL - 我做错了什么?

标签 .net amazon-s3 aws-sdk amazon-kms

我正在使用适用于 .NET 4.0 的 AWS 开发工具包 v2.3.44.0,并尝试生成预签名 URL 供客户端下载对象。所有对象都存储在 S3 存储桶中,并使用 aws:kms 服务器端加密方法进行加密。

我使用 AmazonS3ClientGetPreSignedURL 方法生成 URL。

我的 AmazonS3Client 对象的创建方式如下:

var client = new AmazonS3Client(new AmazonS3Config
{
    RegionEndpoint = RegionEndpoint.USEast1,
    SignatureVersion = "4"
});

我的 GetPresignedUrlRequest 对象是这样创建的:

var request = new GetPreSignedUrlRequest
{
    BucketName = bucket,
    Key = key,
    Expires = expires,
    ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS
 };

现在,当我运行 client.GetPreSignedURL(request) 时,它会生成一个如下所示的 URL(经过格式化以提高可读性并进行清理):

https://{bucket}.s3.amazonaws.com/{key}?AWSAccessKeyId={access key}
    &Expires={timestamp}
    &Signature=AWS4-HMAC-SHA256%20Credential%3D{access key}%2F20150626%2Fus-east-1%2Fs3%2Faws4_request%2C%20SignedHeaders%3Dhost%3Bx-amz-content-sha256%3Bx-amz-date%3Bx-amz-server-side-encryption%2C%20Signature%3D{signature}

导航到此 URL 时,我收到错误的 XML 分割:SignatureDoesNotMatch

此 URL 看起来与亚马逊在 their docs 中描述的 URL 不同。此外,使用 AWS 插件从 Visual Studio 生成 URL 会生成一个如下所示的工作 URL(再次格式化和清理):

https://{bucket}.s3.amazonaws.com/{key}?
    X-Amz-Expires=900
    &X-Amz-Algorithm=AWS4-HMAC-SHA256
    &X-Amz-Credential={access key}/20150626/us-east-1/s3/aws4_request
    &X-Amz-Date=20150626T195148Z
    &X-Amz-SignedHeaders=host
    &X-Amz-Signature={signature}

我做错了什么,没有正确生成用于下载 aws:kms 加密文件的预签名 URL?

最佳答案

好吧,经过一番挖掘,我发现了我错在哪里。要使用 SignatureVersion4,您需要在创建客户端之前通过 AWSConfigs.S3Config 对象上的静态属性进行设置。我设置的所有其他字段在我的情况下也不需要。

因此正确的方法是:

 private static AmazonS3Client CreateClient()
 {
     AWSConfigs.S3Config.UseSignatureVersion4 = true;
     return new AmazonS3Client(RegionEndpoint.USEast1);
 }

并创建请求

 var request = new GetPreSignedUrlRequest
 {
     BucketName = bucket,
     Key = key,
     Expires = expires
 };

关于.net - 使用 KMS 加密为 S3 对象生成预签名 URL - 我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081153/

相关文章:

.net - 为什么从不同线程更新 UI 的模式没有内置到 .NET 框架中?

c# - Fluent Nhibernate - 如何指定表名

objective-c - 使用委托(delegate)、操作和队列

amazon-s3 - 以编程方式与 Amazon S3 存储桶交互的最佳方式 AWS SDK for .net 或 tntDrive?

.net - 列表框刷新的 MVVM 出现问题

c# - 在数据 GridView 中过滤后显示原始行索引

python - 使用 django-storages/boto 在本地收集静态作品,但在 Heroku 上没有

node.js - 使用 FFMPEG 转换文件并上传到 AWS S3 Nodejs

php - 使用 Amazon SES sendRawEmail 进行电子邮件编码

javascript - 如何解决网络故障 net::ERR_NAME_NOT_RESOLVED