Идея состояла в том, чтобы генерировать случайный ключ для каждого загружаемого файла, передать этот ключ S3, чтобы зашифровать его и сохранить ключ в базе данных. Когда пользователь хочет получить доступ к файлу, ключ считывается из базы данных и снова переходит на S3.AWS S3 SSE GetObject требует секретного ключа
Первая часть работает. Мои объекты загружены и зашифрованы успешно, но у меня есть проблемы с их извлечением.
Извлечение файлов с заголовков запроса набор:
При настройке заголовков запроса, такие как x-amz-server-side-encryption-customer-algorithm
и т.д. при выполнении запроса GET к ресурсу, работает, и я могу получить к нему доступ. Но поскольку я хочу использовать эти ресурсы как src
для <img>-Tag
, я не могу выполнять запросы GET, для которых требуются заголовки.
Таким образом, я думал о:
Pre подписания URLs:
Чтобы создать предварительно подписанный URL, я построил HMAC SHA1 требуемой строки и использовать его в качестве подписи. Вычисленная сигнатура принимается S3, но я получаю следующую ошибку при запросе предварительно подписанного URL-адреса:
Запросы, указывающие на стороне сервера Шифрование с предоставленными Клиентом ключами, должны предоставить соответствующий секретный ключ.
URL-адрес имеет вид:
https://s3-eu-west-1.amazonaws.com/bucket-id/resource-id?x-amz-server-side-encryption-customer-algorithm=AES256&AWSAccessKeyId=MyAccessKey&Expires=1429939889&Signature=GeneratedSignature
Причина показана ошибка, кажется, довольно ясно. Ни при каких условиях в процессе подписания не использовался ключ шифрования. Таким образом, запрос не может работать. В результате я добавил ключ шифрования как Base64 и Md5 в качестве параметров URL. URL-адрес теперь имеет следующий формат:
https://s3-eu-west-1.amazonaws.com/bucket-id/resource-id?x-amz-server-side-encryption-customer-algorithm=AES256&AWSAccessKeyId=MyAccessKey&Expires=1429939889&Signature=GeneratedSignature&x-amz-server-side-encryption-customer-key=Base64_Key&x-amz-server-side-encryption-customer-key-MD5=Md5_Key
Хотя ключ сейчас присутствует (imho), я получаю такое же сообщение об ошибке.
Вопрос Кто-нибудь знает, как я могу получить доступ к зашифрованным файлам с GET
запроса, который не предусматривает каких-либо заголовки, такие как x-amz-server-side-encryption-customer-algorithm
?
Спасибо за отличное объяснение. Однако моя проблема не решена. Я хочу использовать потребительское шифрование, чтобы убедиться, что разрешен просмотр только владельцам файлов. Таким образом, наличие ссылки, содержащей ключ, не является реальной проблемой, поскольку мой бэкэнд гарантирует только отправку ссылки правильному пользователю. При использовании ключевых механизмов Amazon я не знаю, как контролировать, кто может просматривать файлы, а кто нет. В это время мне кажется, что при использовании ключа Amazon я должен создать пользователя в Amazon для каждого моего пользователя и, соответственно, обновить объекты acl. –
* «мой бэкэнд гарантирует только отправку ссылки правильному пользователю» * ... если это правда, это звучит так, как будто вы игнорируете очевидное: если пользователю не разрешено видеть файл, не давайте для них подписанный URL-адрес. Объекты в S3 не являются общедоступными, если вы не создадите их таким образом, либо через ACL-объекты, либо с помощью политики ведра. Неподписанная ссылка на правильно настроенный объект и ведро даже не показывает, существует ли такой объект даже. Это просто «403 Запрещено». Дай мне знать, смогу ли я это прояснить. –