首页 文章

Amazon Cloudfront签名URL访问被拒绝的问题

提问于
浏览
2

我正在尝试为我的S3存储桶中的内容构建Amazone cloudfront的签名URL . 我已经按照amazone aws doc Build 一个签名网址的程序是http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-content-custom-policy-creating-signature-download-procedure但是我正在构建网址的某些原因是收到此消息"AccessDeniedAccess denied" .

我还在 Distribution SettingsBehaviors 中添加了"Trusted Signers"作为"self",并为该发行版添加了 orignin . 我不确定我错过了什么 . 这是我的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;

?>

我已尝试使用域名和cname for download_url但没有效果 . 那是我尝试了两种url格式

$download_url = "MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3" 
$download_url = "MY_DOWNLOAD_CNAME/download/2012/01/FILE_NAME.mp3"

但没有工作 . 谁可以帮我这个事 . 我确信这里缺少一些非常小的东西,或者需要使用存储桶设置完成某些操作但不知道现在该做什么 . 急需帮助

1 回答

  • 4

    您必须在下载URL中添加协议(http://或https://) . 因为有和没有的签名会有所不同 . Cloud 前端后端可能使用完整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"
    

相关问题