我正在尝试为我的 S3 存储桶中的内容构建 Amazone cloudfront 的签名 URL。我按照从 amazone aws doc 构建签名 URL 的过程,即 http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-content-custom-policy-creating-signature-download-procedure但由于某些原因,我正在构建的 url 收到此消息“AccessDeniedAccess 被拒绝”。
我还从分发设置的行为中将“受信任的签名者”添加为“自己”,并添加了来源那个分布。我不确定我错过了什么。这是我的 php 代码
<?php
function rsa_sha1_sign($policy, $private_key_filename)
{
$signature = "";
// load the private key
$fp = fopen($private_key_filename, "r");
$priv_key = fread($fp, 8192);
fclose($fp);
//echo $priv_key;
$pkeyid = openssl_get_privatekey($priv_key);
// compute signature
openssl_sign($policy, $signature, $pkeyid);
// free the key from memory
openssl_free_key($pkeyid);
//echo $signature;
return $signature;
}
function url_safe_base64_encode($value)
{
$encoded = base64_encode($value);
// replace unsafe characters +, = and / with
// the safe characters -, _ and ~
return str_replace(
array('+', '=', '/'),
array('-', '_', '~'),
$encoded);
}
$key_pair_id = "MY_KEY_PAIR_ID";
$donwload_cname = "MY_DOWNLOAD_CNAME";
$download_url = "MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3";
$DateLessThan = time() + (24*7*60*60);
$policy = '{"Statement":[{"Resource":"'.$download_url.'","Condition":{"DateLessThan":{"AWS:EpochTime":'.$DateLessThan.'}}}]}';
$private_key_file = "MY_PRIVATE_KEY_FILE.pem";
$signature = rsa_sha1_sign($policy, $private_key_file);
$signature = url_safe_base64_encode($signature);
$final_url = $download_url.'?Policy='.url_safe_base64_encode($policy).'&Signature='.$signature.'&Key-Pair-Id='.$key_pair_id;
echo $final_url;
?>
我已尝试使用 download_url 的域名和 cname,但没有效果。也就是说我已经尝试了两种 url 格式
$download_url = "MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3"
$download_url = "MY_DOWNLOAD_CNAME/download/2012/01/FILE_NAME.mp3"
但没有任何效果。谁可以帮我这个事 。我确信这里缺少一些非常小的东西,或者需要对存储桶设置进行一些操作,但不知道现在该怎么做。需要紧急帮助
最佳答案
您还必须在下载 URL 中添加协议(protocol)(http://或 https://)。因为有和没有的签名会有所不同。 云前端后端可能使用完整的 URL(带有 http://或 https://)生成签名,但签名与您的不匹配,并且您收到访问被拒绝错误。
使您的下载网址如下所示,
$download_url = "http://MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3"
或 https://
$download_url = "https://MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3"
关于php - Amazon Cloudfront 签名 URL 访问被拒绝问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14426045/