【发布时间】:2014-02-21 22:36:43
【问题描述】:
我在使用签名 URL 时无法播放 Cloudfront 视频。如果我不需要签名 URL,一切正常。这是签署网址的代码:
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);
}
// No restriction
$keyPairId = "KEYPAIRID-DIST-NOT-REQUIRING-SIGNEDURL";
$download_url = "http://URL-DIST-NOT-REQUIRING-SIGNEDURL.cloudfront.net/myvideo.mp4";
//This is just a flag to aid in switching between the 2 testing distributions
if($restrict) {
$key_pair_id = "KEYPAIRID-DIST-REQUIRING-SIGNEDURL"";
$download_url = "http://URL-DIST-REQUIRING-SIGNEDURL.cloudfront.net/myvideo.mp4";
}
$DateLessThan = time() + (24*7*60*60);
$policy = '{"Statement":[{"Resource":"'.$download_url.'","Condition":{"DateLessThan":{"AWS:EpochTime":'.$DateLessThan.'}}}]}';
$private_key_file = "/path/to/privatekey.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;
在上面,如果我使用需要签名 URL 的 Cloudfront 分发(通过传入 $restrict=1),则会收到错误消息“找不到视频”。在控制台中,我看到视频的 GET 请求已被取消(状态文本:已取消......奇怪的是我看到了两次)。如果我使用不需要签名 URL 的分发,一切正常并且视频加载正确。
我错过了什么?除了需要签名 URL 之外,这些分布是相同的,并且它们都使用相同的 Amazon S3 存储桶源来存储视频。
播放器是 flowplayer(HTML5),但由于没有签名的 url 它可以正常工作,我认为播放器不是问题。
【问题讨论】:
标签: php html video amazon-cloudfront