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;