0

Flowplayer で使用する RTMP 用の署名付き CloudFront URL を生成する PHP スクリプトを作成しましたが、これは正常に動作していますが、同じ署名生成方法を使用してダウンロード URL を作成すると、Amazon から AccessDenied XML ファイルを取得します。私はほぼすべてを試しましたが、私は機知に富んでいます。RTMP ストリーミングでは署名が機能するのに、ダウンロードでは同じ署名生成方法が失敗する理由を知っている人はいますか?

$keyPairId = 'APK...';
$privateKey = '/var/www/certs/pk-APK....pem';
$rtmp = false; 
$distribution = 'd2m...';

// Get extension.
$extension = substr($this->getFilename(), strrpos($this->getFilename(), '.') + 1);
$fileName = substr($this->getFilename(), 0, strrpos($this->getFilename(), '.'));

$expires = strtotime(gmdate('Y-m-d H:i:s', strtotime('+3 hours')));
$json = '{"Statement":[{"Resource":"' . $fileName . '","Condition"{"DateLessThan":{"AWS:EpochTime":' . $expires . '}}}]}';

// read cloudfront private key pair
$fp = fopen($privateKey, 'r');
$priv_key = fread($fp, 8192);
fclose($fp);

// create the private key
$key = openssl_get_privatekey($priv_key);

// sign the policy with the private key
// depending on your php version you might have to use
// openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1)
openssl_sign($json, $signed_policy, $key);

openssl_free_key($key);

// create url safe signed policy
$base64_signed_policy = base64_encode($signed_policy);
$signature = str_replace(array('+', '=', '/'), array('-', '_', '~'),                 $base64_signed_policy);

// construct the url
$urlParams = urlencode($this->getFilename()) . '?Expires=' . $expires .'&Signature=' . $signature . '&Key-Pair-Id=' . $keyPairId;
$keyPairId;
if ($rtmp) {
    $url = ( ($this->getExtension() != 'flv') ? $this->getExtension() . ':' : '' ) . $urlParams;
} else {
    $url = 'https://' . $distribution . '.cloudfront.net/' . $urlParams;
}
4

1 に答える 1