Я пытаюсь получить доступ к статическому контенту из своей корзины s3 с помощью AWS CloudFront. Я могу получить доступ к этому контенту, используя подписанный URL, но когда я пытаюсь использовать аутентификацию подписанных файлов cookie AWS, это дает мне AccessDeniedAccess отклонен ошибка.
Я дважды проверил конфигурацию моего CloudFront и S3. Но это кажется идеальным.
Я использую пользовательский сертификат SSL для своей CloudFront и стандартную политику для доступа к контенту.
<?php
getSignature("http://cdn.******.ca", 300000);
echo '<html>
<head></head>
<body>
<iframe src="https://cdn.****/file.pdf">
</body>
</html>';
function getSignature($resource = null, $expires = null, $policy = null)
{
$keyPairId = 'AP*****';
$signatureHash = array();
if ($policy) {
$policy = preg_replace('/\s/s', '', $policy);
$signatureHash['Policy'] = encode($policy);
header ( "Set-Cookie: CloudFront-Policy=".$signatureHash['Policy']."; path=/; domain=***.ca; httpOnly", false );
}
elseif ($resource && $expires) {
$policy = createCannedPolicy($resource, $expires);
$signatureHash['Expires'] = $expires;
header ( "Set-Cookie: CloudFront-Expires=".$signatureHash['Expires']."; path=/; domain=***.ca; httpOnly", false );
}
else {
return false;
}
$signatureHash['Signature'] = encode(sign($policy));
header ( "Set-Cookie: CloudFront-Signature=".$signatureHash['Signature']."; path=/; domain=***.ca; httpOnly", false );
$signatureHash['Key-Pair-Id'] = $keyPairId;
header ( "Set-Cookie: CloudFront-Key-Pair-Id=".$signatureHash['Key-Pair-Id']."; path=/; domain=***.ca; httpOnly", false );
return $signatureHash;
}
function createCannedPolicy($resource, $expiration)
{
$json = '{"Statement":[{"Resource":"'.$resource.'","Condition":{"DateLessThan":{"AWS:EpochTime":'.$expiration.'}}}]}';
return $json;
}
function sign($policy)
{
$signature = '';
$privateKey = 'path/pk-APK***.pem';
$fp=fopen($privateKey,"r");
$priv_key=fread($fp,8192);
fclose($fp);
$key = openssl_get_privatekey($priv_key);
openssl_sign($policy, $signature, $key);
return $signature;
}
function encode($policy)
{
return strtr(base64_encode($policy), '+=/', '-_~');
}
?>
Задача ещё не решена.
Других решений пока нет …