6

PHPで正常に動作するCloudfrontの署名付きURLがあります。バケット ポリシーは S3 の HTTP リファラーで機能しますが、Cloudfront は HTTP リファラー チェックをサポートしていないため、ファイルを 1 つの IP アドレス (ファイルを要求して署名付き URL を生成したクライアント、または理想的には Web サーバー) にのみ提供する必要があります。

IP アドレス要素を JSON コードに追加して動作するように助けてもらえますか?

"IpAddress":{"AWS:SourceIp":"192.0.2.0/24"},

私は PHP とポリシー ステートメントで迷っていますが、知っている人にとっては簡単かもしれないと思います: http://tinyurl.com/9czr5lp

カスタムポリシーのエンコード/署名は少し異なります: http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-content-custom -ポリシーステートメント

以下は AWS の例で、IP アドレスのロックイン以外は機能します。

誰かが私に 2 分間手を貸していただければ、これを非常に迅速にテストできます。

助けてくれてありがとう:)

ジョン

    function getSignedURL($resource, $timeout)
    {
        $keyPairId = "XXXXXXXXXXXX";
        $expires = time() + $timeout;
        $json = '{"Statement":[{"Resource":"'.$resource.'","Condition":{"DateLessThan":     {"AWS:EpochTime":'.$expires.'}}}]}';
        $fp=fopen("pk-XXXXXXXX.pem","r");

        $priv_key=fread($fp,8192);
        fclose($fp);

        $key = openssl_get_privatekey($priv_key);
        if(!$key)
        {
                echo "<p>Failed to load private key!</p>";
                return;
        }

        //Sign the policy with the private key

        if(!openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1))
        {
                echo '<p>Failed to sign policy: '.openssl_error_string().'</p>';
                return;
        }
        //Create url safe signed policy
        $base64_signed_policy = base64_encode($signed_policy);
        $signature = str_replace(array('+','=','/'), array('-','_','~'), $base64_signed_policy);
        //Construct the URL
        $url = $resource.'?Expires='.$expires.'&Signature='.$signature.'&Key-Pair-Id='.$keyPairId;
        return $url;
}
$url = getSignedURL("http://s675765.cloudfront.net/filename.mp4", 600);
print $url;
4

1 に答える 1

3
{"Statement":[{"Resource":"testRes","Condition":{"DateLessThan":{"AWS:EpochTime":1357034400},"IpAddress":{"AWS:SourceIp":"192.0.2.0\/24"}}}]}

これは、値が埋められエスケープされた有効な JSON 文字列です。IP アドレスを変数として渡す場合は、必ずエスケープしてください。/

例えば

$escapedIp = str_replace( '/', '\/', $ipAddress );

php json extension を見てください。これにより、作業が非常に簡単になります。

PHP配列としてのステートメントの例

$statement = array( 
    'Statement' => array( 
        array(
            'Resource' => $resource, 
            'Condition' => array( 
                'DateLessThan' => array( 
                    'AWS:EpochTime' => $expires 
                ),
                'IpAddress' => array( 
                    'AWS:SourceIp' => $ipAddress 
                ) 
            ) 
        )
    ) 
);

$json = json_encode( $statement );
于 2012-11-14T00:48:09.497 に答える