Создание предварительно подписанного URL-адреса для объекта S3 с шифрованием KMS — что я делаю неправильно?

Я использую AWS SDK v2.3.44.0 для .NET 4.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 отличается от того, который Amazon описывает в их документы. Кроме того, создание URL-адреса из Visual Studio с помощью подключаемого модуля AWS создает рабочий 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 зашифрованных файлов?


person derekmckinnon    schedule 26.06.2015    source источник


Ответы (1)


Хорошо, после долгих копаний я нашел, где я ошибся. Чтобы использовать 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
 };
person derekmckinnon    schedule 29.06.2015