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, этов любом случае, только в защищенной среде, потому что необходимо обращаться с ключом в открытом виде.