使用 KMS 加密为 S3 对象生成预签名 URL - 我做错了什么?
Generating a pre-signed URL for S3 object with KMS encryption - what am I doing wrong?
我正在使用适用于 .NET 4.0 的 AWS SDK v2.3.44.0 并尝试生成预签名 URL 供客户端下载对象。所有对象都存储在 S3 存储桶中,并使用 aws:kms
服务器端加密方法进行加密。
我正在使用 AmazonS3Client
的 GetPreSignedURL
方法生成 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 中描述的不同。此外,使用 AWS 插件从 Visual Studio 生成 URL 生成一个 working 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}
我的预签名 URL 未正确生成以下载 aws:kms
加密文件,我做错了什么?
好吧,经过大量挖掘,我找到了错误的地方。要使用 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 4.0 的 AWS SDK v2.3.44.0 并尝试生成预签名 URL 供客户端下载对象。所有对象都存储在 S3 存储桶中,并使用 aws:kms
服务器端加密方法进行加密。
我正在使用 AmazonS3Client
的 GetPreSignedURL
方法生成 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 中描述的不同。此外,使用 AWS 插件从 Visual Studio 生成 URL 生成一个 working 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}
我的预签名 URL 未正确生成以下载 aws:kms
加密文件,我做错了什么?
好吧,经过大量挖掘,我找到了错误的地方。要使用 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
};