3

我一直在使用 AWS SDK V3 for PHP 将对象放入 S3,并使用客户提供的密钥进行服务器端加密。该文档非常粗略(或者至少我还没有找到它)。

为了使用 S3client 上传对象,我使用 putobject

        $params['SSECustomerAlgorithm'] = 'AES256';
        $params['SSECustomerKey'] = $this->encryptioncustkey;
        $params['SSECustomerKeyMD5'] = $this->encryptioncustkeymd5;

$this->encryptioncustkey 是一个普通的客户密钥(不是 base64_encoded,因为 SDK 似乎正在这样做)和 this->encryptioncustkeymd5 = md5($this->encryptioncustkey,true);

put 对象工作正常。但是,问题在于生成 createSignedURL。

$cmd = $client->getCommand('GetObject', array(
            'Bucket' => $bucket,
            'Key'    => $storedPath,
            'ResponseContentDisposition' => 'attachment;charset=utf-8;filename="'.utf8_encode($fileName).'"',
            'ResponseContentType' => $ctype,  
            'SSECustomerAlgorithm' => 'AES256',
            'SSECustomerKey' => $this->encryptioncustkey,
            'SSECustomerKeyMD5' => $this->encryptioncustkey64md5
    ));

但我收到一个奇怪的响应,表明它缺少“x-amz-server-side-encryption”(ServerSideEncryption),根据文档,SSE-C 不需要它。即使我将它设置为 ServerSideEncryption='AES256' 它也没有效果。

<Error>
<Code>InvalidArgument</Code>
<Message>
Requests specifying Server Side Encryption with Customer provided keys must    provide an appropriate secret key.
</Message>
<ArgumentName>x-amz-server-side-encryption</ArgumentName>
<ArgumentValue>null</ArgumentValue>
<RequestId>A3368F6CE5DD310D</RequestId>
<HostId>
nHavXXz/gFOoJT0tnh+wgFTbTgGdpggRkyb0sDh07H7SomcX7HrcKU1dDzgZimrQwyaVQEqAjdk=
</HostId>
</Error>
4

1 回答 1

0

我遇到了同样的问题,并尝试了所有可能的排列以使其正常工作。我最后得出结论,不支持这个用例。阅读有关该主题的零散而晦涩的文档,似乎在 S3 上访问 SSE-C 内容的唯一方法是在 HTTP 请求标头中x-amz-server-side-encryption-customer-algorithm指定//字段x-amz-server-side-encryption-customer-key,而不是在 URL 中。x-amz-server-side-encryption-customer-key-MD5

我最终做的是将有问题的内容存储在未加密的 S3 中,并将 ACL 设置为private(您可以从一开始就将其上传,或使用copyObject()这些设置制作副本)。然后,当我想为 GET 请求获取 ["time-bombed"] 预签名 URL 时,我只是使用了与您问题中的命令类似的命令,但省略了 SSE 参数。这对我有用。

于 2017-10-17T17:10:53.230 回答