Доступ к 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";
}

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

16

Решение

Я также столкнулся с этой проблемой aws:kms Encyrption ключ, я предлагаю, если вы хотите использовать kms ключ, то вы должны создать свой kms key в IAM section of AWS Console, Я люблю рекомендовать AES256 Шифрование на стороне сервера, здесь S3 автоматически Зашифровывает ваши данные при вводе и расшифровывает при получении объекта. Пожалуйста, перейдите по ссылке ниже:
Шифрование на стороне сервера S3 с помощью 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";
}

Пожалуйста, также обновите вашу политику bucket ниже json, это предотвратит загрузку объекта без AES256 шифрование

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

Другие решения

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

]);

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

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector