Intereting Posts
Изображение PHP / Imagick / PDFlib Flop изменяет свою битовую глубину Как предоставить внешний параметр учетной записи при создании управляемой учетной записи в полосе с помощью php? Новый Google ReCaptcha не отправляет / не получает «g-recaptcha-response» Сценарий загрузки Joomla на определенной странице Выяснение установленной версии ветки Как вернуть подкласс из конструктора в PHP Сжатие содержимого с помощью PHP ob_start () vs Apache Deflate / Gzip? неявный paypal payment – PAY – у вас нет разрешения на выполнение этого платежа неявно url :: предыдущий выпуск в laravel Что нужно хранить в cookie для системы входа? Регулярное выражение и акценты / тильды Sharepoint: доступ к файлам sharepoint для SQL почему mysql_fetch_array () ожидает, что параметр 1 будет ресурсом? почему ресурс не является параметром 1? Как заставить PHP установить код состояния HTTP на 500 автоматически в случае каких-либо ошибок? (включая те, которые не могут обрабатываться пользователем) Условие выполнения в XPath

Доступ AWS S3 запрещен при получении изображения по URL-адресу

Я работаю над AWS EC2 Ubuntu Machine и пытаюсь получить изображение с AWS S3, но после этого мне все время показывают ошибку.

<Error> <Code>InvalidArgument</Code> <Message> Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4. </Message> <ArgumentName>Authorization</ArgumentName> <ArgumentValue>null</ArgumentValue> <RequestId>7C8B4BF1CE2FDC9E</RequestId> <HostId> /L5kjuOET4XFgGter2eFHX+aRSvVm/7VVmIBqQE/oMLeQZ1ditSMZuHPOlsMaKi8hYRnGilTqZY= </HostId> </Error> 

Вот моя политика в корзине

 { "Version": "2012-10-17", "Id": "Policy1441213815928", "Statement": [ { "Sid": "Stmt1441213813464", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::mytest.sample/*" } ] } 

введите описание изображения здесь

Вот код

 require 'aws-autoloader.php'; $credentials = new Aws\Credentials\Credentials('key', 'key'); $bucketName = "mytest.sample"; $s3 = new Aws\S3\S3Client([ 'signature' => 'v4', 'version' => 'latest', 'region' => 'ap-southeast-1', 'credentials' => $credentials, 'http' => [ 'verify' => '/home/ubuntu/cacert.pem' ], 'Statement' => [ 'Action ' => "*", ], ]); $result = $s3->getObject(array( 'Bucket' => $bucketName, 'Key' => 'about_us.jpg', )); 

Html

 <img src="<?php echo $result['@metadata']['effectiveUri']; ?>" /> 

Изменить для Майкла – sqlbot: здесь я использую KMS по умолчанию.

  try { $result = $this->Amazon->S3->putObject(array( 'Bucket' => 'mytest.sample', 'ACL' => 'authenticated-read', 'Key' => $newfilename, 'ServerSideEncryption' => 'aws:kms', 'SourceFile' => $filepath, 'ContentType' => mime_content_type($filepath), 'debug' => [ 'logfn' => function ($msg) { echo $msg . "\n"; }, 'stream_size' => 0, 'scrub_auth' => true, 'http' => true, ], )); } catch (S3Exception $e) { echo $e->getMessage() . "\n"; } 

дайте мне знать, если вам нужно больше.

Я также сталкиваюсь с этой проблемой с помощью aws:kms encyrption. Я предлагаю, чтобы, если вы хотели использовать ключ kms вам нужно создать свой kms key в IAM section of AWS Console . Я обожаю рекомендуемое шифрование на стороне сервера AES256 , здесь S3 автоматически шифрует ваши данные во время установки и дешифрования при получении объекта. Пожалуйста, перейдите по ссылке: S3 Server Side encryption с AES256

Мое решение изменяет эту строку 'ServerSideEncryption' => 'aws:kms' with 'ServerSideEncryption' => 'AES256'

  try { $result = $this->Amazon->S3->putObject(array( 'Bucket' => 'mytest.sample', 'ACL' => 'authenticated-read', 'Key' => $newfilename, 'ServerSideEncryption' => 'AES256', 'SourceFile' => $filepath, 'ContentType' => mime_content_type($filepath), 'debug' => [ 'logfn' => function ($msg) { echo $msg . "\n"; }, 'stream_size' => 0, 'scrub_auth' => true, 'http' => true, ], )); } catch (S3Exception $e) { echo $e->getMessage() . "\n"; } 

Пожалуйста, также обновите свою политику ведра с помощью json, это предотвратит загрузку объекта с использованием AES256

 { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::yourbucketname/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" } } } 

PHP sdk v2

  1. пакет учетных данных Aws\Common\Credentials
  2. для создания S3Client вам нужен завод

Попробуйте что-то вроде этого

 use Aws\S3\S3Client; use Aws\Common\Credentials\Credentials; $credentials = new Credentials('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY'); // Instantiate the S3 client with your AWS credentials $s3Client = S3Client::factory(array( 'signature' => 'v4', 'region' => 'ap-southeast-1', 'credentials' => $credentials, ..... ]); ) 

Если это не сработает, вы можете попытаться явно объявить объект SignatureV4

 use Aws\S3\S3Client; use Aws\Common\Credentials\Credentials; use Aws\Common\Signature\SignatureV4; $credentials = new Credentials('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY'); // Instantiate the S3 client with your AWS credentials $s3Client = S3Client::factory(array( 'signature' => new SignatureV4(), 'region' => 'ap-southeast-1', 'credentials' => $credentials, ..... ]); ) 

Если вы переходите на sdk v3

  1. Вы должны иметь signature_version (вместо signature ) как параметр, когда вы объявляете свой клиент s3
  2. Statement не является допустимым параметром ( http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html#signature-version )
  3. если вы можете включить параметр debug чтобы получить больше результатов

Это будет выглядеть так

 $s3 = new Aws\S3\S3Client([ 'signature_version' => 'v4', 'version' => 'latest', 'region' => 'ap-southeast-1', 'credentials' => $credentials, 'http' => [ 'verify' => '/home/ubuntu/cacert.pem' ], 'debug' => true ]); 

см. полный список доступных параметров