Загрузка объектов (файлов) с использованием предварительно заданного URL в AWS S3 не работает - PullRequest
0 голосов
/ 25 сентября 2019

Я загрузил зашифрованный объект, используя шифрование на стороне сервера с предоставленными клиентом ключами (SSE-C).Можно ли загрузить объект с помощью предварительно подписанного URL-адреса в AWS S3?

Я пробовал вот так

GeneratePresignedUrlRequest generatePresignedUrlRequest1 = new GeneratePresignedUrlRequest("bucketname", "objectpath")
       .withMethod(HttpMethod.GET)
       .withSSECustomerKey(new SSECustomerKey("base64mykey"))
       .withExpiration(new Date( System.currentTimeMillis() + (60 * 60 * 1000)));

Ссылка генерируется, но при доступе к ней в браузере я получаюэта ошибка The request signature we calculated does not match the signature you provided. Check your key and signing method. Есть ли решение для этого?

1 Ответ

1 голос
/ 26 сентября 2019

SSE-C с предварительно подписанными URL-адресами может работать не так, как вы ожидаете.

Входные данные для алгоритма подписывания запроса включают все заголовки, которые начинаются с x-amz-*.Это важно по причине, которая станет более понятной в данный момент.

Код, генерирующий подпись, должен знать , что эти значения будут , когда вы фактически сделаете запрос, и это единственное, что делает .withSSECustomerKey() - предоставляет информацию, необходимую алгоритму подписи, чтобы подпись соответствовала фактическому запросу, который вы в конечном итоге отправляете.

Ключ шифрования фактически не встроен в предварительно подписанный URL-адрес.Он должен быть предоставлен во второй раз, когда запрос фактически сделан.

При использовании шифрования на стороне сервера с предоставленными клиентом ключами шифрования (SSE-C) необходимо предоставить информацию о ключе шифрования с помощьюследующие заголовки запроса.

x-amz-server-side​-encryption​-customer-algorithm Используйте этот заголовок, чтобы указать алгоритм шифрования.Значение заголовка должно быть AES256.

x-amz-server-side​-encryption​-customer-key Используйте этот заголовок, чтобы предоставить 256-битный ключ шифрования base64 для Amazon S3, который будет использоваться для шифрования или дешифрования ваших данных.

x-amz-server-side​-encryption​-customer-key-MD5 Используйте этот заголовок для предоставления 128-битного дайджеста MD5 ключа шифрования в кодировке base64 в соответствии с RFC 1321. Amazon S3 использует этот заголовок для проверки целостности сообщения, чтобы гарантировать, что ключ шифрования был передан без ошибок.

https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html

Таким образом, вы можете использовать предварительно подписанный URL-адрес с сервера, используя клиентскую библиотеку HTTP (вставляя эти заголовки в запрос), или вы можете использовать его из браузера.из Javascript, аналогичным образом, или с такими инструментами, как Postman и Curl, но вы не можете использовать его как активируемую или вставляемую гиперссылку, потому что URL не обеспечивает способ указания заголовков HTTP.И, конечно, кажется плохой идеей использовать его и из JS на стороне браузера, поскольку он показывает ключ шифрования в виде открытого текста ... так что, если вы планируете загрузить объект, хранящийся в SSE-C, этов любом случае, только в защищенной среде, потому что необходимо обращаться с ключом в открытом виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...