2017-03-31 65 views
2

我一直使用AWS SDK V3 for PHP將對象放到使用客戶提供的密鑰的服務器端加密的S3上。文檔很粗略(或者至少我沒有找到它)。CreateSignedURL失敗使用PHP的AWS SSE-C

對於使用S3client上傳的對象,我用putobject與

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

的$這個 - > encryptioncustkey是一個普通的用戶密碼(不Base64編碼的,因爲SDK似乎是這樣做的)和這個 - > 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 
    )); 

但我得到其中根據文檔不需要SSE-C怪異響應表明它缺少「X-AMZ-服務器端加密」(ServerSideEncryption)。即使我將它設置爲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> 

回答

0

我遇到了同樣的問題,並試圖儘可能使每個可能的組合變得有效。我終於得出結論,這個用例不支持。閱讀關於這個主題的分散和神祕的文檔,似乎訪問S3上的SSE-C內容的唯一方式是通過在HTTP請求標題中指定x-amz-server-side-encryption-customer-algorithm/x-amz-server-side-encryption-customer-key/字段而不是在URL中。

我最終什麼事做是有問題的內容存儲在S3 加密,並設置爲private的ACL(你可以把它上傳這樣從一開始走,或使用copyObject()使這些設置的副本)。然後,當我想要獲取GET請求的[「time-bombed」]預簽名URL時,我只是使用了類似於您的問題的命令,但省略了SSE參數。這對我有效。