Amazon s3 AWS S3 SSE GetObject需要密钥

Amazon s3 AWS S3 SSE GetObject需要密钥,amazon-s3,Amazon S3,其想法是为上传的每个文件生成一个随机密钥,将该密钥传递给S3以对其进行加密,并将密钥存储在数据库中。一旦用户想要访问该文件,就会从数据库中读取密钥并再次传递给S3 第一部分工作。我的对象已成功上载和加密,但在检索时遇到问题 检索设置了请求头的文件: 设置请求头时,如x-amz-server-side-encryption-customer-algorithm等。对资源执行GET请求时,请求头工作,并且我能够访问它。但是,由于我希望将这些资源作为src添加到-Tag,因此我无法执行需要设置头的GE

其想法是为上传的每个文件生成一个随机密钥,将该密钥传递给S3以对其进行加密,并将密钥存储在数据库中。一旦用户想要访问该文件,就会从数据库中读取密钥并再次传递给S3

第一部分工作。我的对象已成功上载和加密,但在检索时遇到问题

检索设置了请求头的文件:

设置请求头时,如
x-amz-server-side-encryption-customer-algorithm
等。对资源执行GET请求时,请求头工作,并且我能够访问它。但是,由于我希望将这些资源作为
src
添加到
-Tag
,因此我无法执行需要设置头的GET请求

因此,我想到:

预签名URL:

为了创建一个预签名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

对我来说,很直观,您所尝试的应该是有效的

显然,当他们说“标题”时

必须在客户端应用程序中提供所有加密头

-

。。。实际上,它们确实意味着,而S3在作为查询字符串的一部分交付时不接受这些特定值,正如您所期望的,因为S3在这方面有时有些灵活

我已经对此进行了测试,这就是我得出的结论:这样做是不受支持的

查询字符串(和签名)中包含的
x-amz-server-side-encryption-customer-algorithm=AES256
请求以及
x-amz-server-side-encryption-customer-Key
x-amz-server-side-encryption-customer-Key-MD5
头的工作正常。。。我相信你已经发现。。。但是将key和key-md5放入查询字符串中,无论是否将其包含在签名中,似乎都是一条死胡同

一开始似乎有点奇怪,他们不允许在查询字符串中使用此项,因为在查询字符串中可以使用很多其他内容。。。但是再一次,如果你想要加密一些东西,在链接中显示加密密钥似乎没有什么意义。。。更不用说密钥将被捕获到S3访问日志中,这使得加密看起来毫无意义——也许这就是他们要求在头中而不是查询字符串中发送密钥的动机

不过,根据我在测试中发现的情况,我看不到一种直接在超链接中使用客户提供密钥的加密对象的方法


当然,S3 bucket前面的反向代理可以间接地为您进行转换,从查询字符串中获取适当的值并将其放入头中,而不是。。。但是,与让S3使用AWS管理的密钥处理静态加密相比,使用客户提供的可下载对象加密密钥可以获得什么,我真的不清楚。无论采用哪种方式,您都可以使用静态加密。

谢谢您的精彩解释。然而,我的问题并没有真正解决。我想使用使用者加密来确保只允许文件的所有者查看它们。因此,拥有包含密钥的链接并不是一个真正的问题,因为我的后端只确保将链接发送给正确的用户。当使用Amazon的关键机制时,我不知道如何控制谁可以查看文件,谁不可以。此时,在我看来,当使用Amazon的密钥时,我必须为我的每个用户在Amazon上创建一个用户,然后相应地更新对象acl。“我的后端确保只将链接发送到正确的用户”。。。如果是真的,听起来好像你忽略了显而易见的事实:如果用户没有权限查看文件,不要给他们一个签名的URL。S3中的对象不是公开可读的,除非通过对象ACL或bucket策略这样做。到正确配置的对象和bucket的未签名链接甚至不会显示这样的对象是否存在。只是
403禁止
。如果我能澄清,请告诉我。