Cloudfront,HTML5视频和签名URL

时间:2014-01-29 21:08:38

标签: php html5 video amazon-cloudfront

使用已签名的网址时,我无法让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),但由于没有签名的网址,它可以正常工作,我认为播放器不是问题。

1 个答案:

答案 0 :(得分:2)

请在此处查看我的回答:Amazon S3 signed url not working with flowplayer

希望这会有所帮助。

在我的情况下,我需要在签署网址之前删除“mp4:”前缀,然后重新添加。