我正在尝试将S3的服务器端加密用于客户密钥。我创建了一个允许匿名用户上传对象的存储桶,然后尝试上传如下对象:
$ http -v PUT 'https://BUCKETNAME.s3.amazonaws.com/test.txt' \
"x-amz-server-side-encryption-customer-algorithm:AES256" \
"x-amz-server-side-encryption-customer-key:BASE64DKEY" \
"x-amz-server-side-encryption-customer-key-MD5:EmqLRYqvItSQUzWCBAdF+A==" \
< ~/test.txt
PUT /test.txt HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate, compress
Content-Length: 20
Content-Type: application/json; charset=utf-8
Host: BUCKETNAME.s3.amazonaws.com
User-Agent: HTTPie/0.8.0
x-amz-server-side-encryption-customer-algorithm: AES256
x-amz-server-side-encryption-customer-key: BASE64KEY
x-amz-server-side-encryption-customer-key-MD5: EmqLRYqvItSQUzWCBAdF+A==
This is a test file
HTTP/1.1 200 OK
Content-Length: 0
Date: Wed, 21 Oct 2015 22:12:26 GMT
ETag: "5dd39cab1c53c2c77cd352983f9641e1"
Server: AmazonS3
x-amz-id-2: AUOQUfmHEwOPqqvDd5X7aTYk+SX043gVFvM3wlgbzfRcpQsXIxXOFjrTRAM+B2T9Ns6Z/C26lBg=
x-amz-request-id: 6063C14465E4B090
一切似乎都在起作用,尽管加密标题没有回复到响应中。所以,我试图获取我的新对象:
$ curl 'https://BUCKETNAME.s3.amazonaws.com/test.txt'
This is a test file
哦不!我的加密标题似乎已被完全忽略,并且该对象已存储在纯文本中。据我所知the documentation,我正在上传对象。关于我可能做错什么的任何建议?
真正可怕的是,如果我进行GET并包含此密钥,我会收回200.这太可怕了。我可以很容易地开始使用这些调用,但从未注意到没有执行加密。
答案 0 :(得分:1)
我发现了我认为的原因。当我匿名上传对象(但提供密钥)时,服务器端加密凭证被完全忽略,我的对象以明文形式存储。下载时也会忽略凭据,因此下载工作正常。
但是,如果我以任何AWS用户身份进行身份验证,则会尊重标头,并以适当的加密方式存储我的对象。
所以,SSE-C用户的重要注意事项:确保您不匿名上传任何对象,或者整个功能完全忽略您的加密密钥!