2015-06-26 2 views
1

Я использую AWS SDK v2.3.44.0 для .NET 4.0 и пытаюсь создать предварительно подписанный URL-адрес для клиентов для загрузки объектов. Все объекты хранятся в ведро S3 и шифруются с использованием метода шифрования на стороне сервера aws:kms.Создание предварительно подписанного URL-адреса для объекта S3 с шифрованием KMS - что я делаю неправильно?

Я использую метод для создания 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 в their docs. Кроме того, генерации 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} 

Что я делаю не так, что мои предварительно подписанные ссылки не быть правильно создан для загрузки зашифрованных файлов aws:kms?

ответ

2

Хорошо, после долгого рытья я обнаружил, где я ошибся. Чтобы использовать 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 
}; 
Смежные вопросы