2

S3 バケット内にあるコンテンツの Amazone クラウドフロントの署名付き URL を構築しようとしています。http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#である amazone aws doc から署名付き URL を作成する手順に従いました。private-content-custom-policy-creating-signature-download-procedureしかし、私が構築している URL が何らかの理由でこのメッセージ "AccessDeniedAccess denied" を取得しています。

また、 ディストリビューション設定の動作から「信頼できる署名者」を「自己」として追加し、そのディストリビューションのオリジンも追加しました。何が欠けているのかわかりません。ここに私の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" 

しかし、どれも動作しません。誰でもこれについて私を助けることができます。ここに非常に小さなものが欠けているか、バケットの設定で何かを行う必要があると確信していますが、今何をすべきかわかりません。緊急の助けが必要

4

1 に答える 1

4

ダウンロード URL にプロトコル (http:// または https://) も追加する必要があります。それがある場合とない場合の署名は異なるためです。クラウド フロント バックエンドが完全な URL (http:// または https:// を含む) を使用して署名を生成している可能性があり、署名が自分のものと一致せず、アクセス拒否エラーが発生しています。

ダウンロードURLを次のようにします。

$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"
于 2013-01-21T09:14:05.343 に答える