【问题标题】:Using s3 server-side encryption with PHP在 PHP 中使用 s3 服务器端加密
【发布时间】:2011-12-02 15:55:43
【问题描述】:

我已决定使用亚马逊新的 s3 服务器端加密,但是我遇到了一个我无法解决的问题。

我正在使用此处找到的 s3 PHP 类:https://github.com/tpyo/amazon-s3-php-class

我最初一直使用这段代码来放置对象(并且它正在工作):

     S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE,
         array(),
    array( 
        "Content-Disposition" => "attachment; filename=$filename",
        "Content-Type" => "application/octet-stream"
            )
);

然后我按照此处的说明进行操作:http://docs.amazonwebservices.com/AmazonS3/latest/API/index.html?RESTObjectPUT.html 并添加了“x-amz-server-side​-encryption”请求标头。但是现在当我尝试放置一个对象时,它会失败而不会出错。

我的新代码是:

  S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE,
     array(),
array( 
    "Content-Disposition" => "attachment; filename=$filename",
    "Content-Type" => "application/octet-stream",
        "x-amz-server-side​-encryption" => "AES256"
        )

);

有没有人尝试过这个新功能,或者任何人都可以看到代码中的错误。

干杯。

【问题讨论】:

    标签: php api amazon-s3


    【解决方案1】:

    该标头应该是$metaHeaders 数组的一部分,而不是$requestHeaders 数组。

    S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE,
         array(
            "x-amz-server-side​-encryption" => "AES256"
         ),
         array( 
           "Content-Disposition" => "attachment; filename=$filename",
           "Content-Type" => "application/octet-stream"
         )
    );
    

    这是来自docs的方法定义:

    putObject (mixed $input, 
               string $bucket, 
               string $uri, 
               [constant $acl = S3::ACL_PRIVATE], 
               [array $metaHeaders = array()], 
               [array $requestHeaders = array()])
    

    您也可以考虑使用SDK for PHP?

    【讨论】:

    • 感谢 Geoff 的回答,不幸的是它似乎也不起作用。我会做更多的摆弄,看看我是否在某个地方忽略了一些东西。
    • @davee - 在这种情况下,我怀疑是因为该库尚未更新以支持新的服务器端加密。为什么不用官方的 PHP SDK?
    • 我认为它也可能是类,但后来我查看了源代码,发现标题设置如下: if (is_array($requestHeaders)) foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);所以理论上添加服务器端加密应该可以工作。这让我想到,亚马逊可能还没有在其所有系统中完全实现该功能。另外,不幸的是,我继承的代码严重依赖这个类,我没有时间更新所有代码。我会看看我是否可以从亚马逊的某个人那里得到回复并在这里发布我的发现。干杯。
    【解决方案2】:

    我们可以使用以下代码上传加密文件 $s3->create_object($bucket_name,$destination,array( 'acl'=>AmazonS3::ACL_PUBLIC, 'fileUpload' => $file_local, 'encryption'=>"AES256"));

    你可以从here下载最新的sdk

    【讨论】:

      【解决方案3】:

      使用官方 SDK:

      use Aws\S3\S3Client;
      
      $bucket = '*** Your Bucket Name ***';
      $keyname = '*** Your Object Key ***';
      // $filepath should be absolute path to a file on disk                      
      $filepath = '*** Your File Path ***';
      
      // Instantiate the client.
      $s3 = S3Client::factory();
      
      // Upload a file with server-side encryption.
      $result = $s3->putObject(array(
          'Bucket'               => $bucket,
          'Key'                  => $keyname,
          'SourceFile'           => $filepath,
          'ServerSideEncryption' => 'AES256',
      ));
      

      更改现有对象的服务器端加密(复制操作)

      use Aws\S3\S3Client;
      
      $sourceBucket = '*** Your Source Bucket Name ***';
      $sourceKeyname = '*** Your Source Object Key ***';
      
      $targetBucket = '*** Your Target Bucket Name ***';
      $targetKeyname = '*** Your Target Object Key ***';
      
      // Instantiate the client.
      $s3 = S3Client::factory();
      
      // Copy an object and add server-side encryption.
      $result = $s3->copyObject(array(
          'Bucket'               => $targetBucket,
          'Key'                  => $targetKeyname,
          'CopySource'           => "{$sourceBucket}/{$sourceKeyname}",
          'ServerSideEncryption' => 'AES256',
      ));
      

      来源:http://docs.aws.amazon.com/AmazonS3/latest/dev/SSEUsingPHPSDK.html

      【讨论】:

        【解决方案4】:

        使用 laravel 5+ 可以通过 filesystems.php 配置轻松完成,您不需要获取驱动程序或低级对象。

        's3' => [
          'driver' => 's3',
          'key'    => "Your Key",
          'secret' => "Your Secret",
          'region' => "Bucket Region",
          'bucket' => "Bucket Name",
          'options' => [
            'ServerSideEncryption' => 'AES256',
          ]
        ],
        //Code
        $disk->put("filename", "content", "public"); // will have AES for file
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多