3

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

我正在使用AmazonS3Client'sGetPreSignedURL方法生成 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 看起来与亚马逊在他们的文档中描述的不同。此外,使用 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 没有正确生成以下载加密文件,我做错了什么?

4

1 回答 1

4

好吧,经过大量挖掘,我发现了哪里出错了。要使用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
 };
于 2015-06-29T17:54:49.023 回答