使用已签名的网址时,我无法让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存储桶源。
播放器是流动播放器(HTML5),但由于没有签名的网址,它可以正常工作,我认为播放器不是问题。
答案 0 :(得分:2)
请在此处查看我的回答:Amazon S3 signed url not working with flowplayer
希望这会有所帮助。
在我的情况下,我需要在签署网址之前删除“mp4:”前缀,然后重新添加。