2 votes

Problème d'accès refusé à l'URL signée d'Amazon Cloudfront

J'essaie de construire une url signée de Amazone Cloudfront pour le contenu qui se trouve dans mes buckets S3. J'ai suivi la procédure de construction d'une url signée à partir de la doc d'Amazone aws qui est http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-content-custom-policy-creating-signature-download-procedure mais pour une raison quelconque, l'url que je construis obtient ce message "AccessDeniedAccess denied".

J'ai également ajouté les "Signataires de confiance" en tant que "self" à partir de l'écran d'accueil. Comportements de la Paramètres de distribution et ajoutez également un orignine pour cette distribution . Je ne suis pas sûr de ce qui me manque. Voici mon code php.

<?php

    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);
     }

    $key_pair_id = "MY_KEY_PAIR_ID";
    $donwload_cname = "MY_DOWNLOAD_CNAME";
    $download_url = "MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3";

    $DateLessThan = time() + (24*7*60*60);
    $policy = '{"Statement":[{"Resource":"'.$download_url.'","Condition":{"DateLessThan":{"AWS:EpochTime":'.$DateLessThan.'}}}]}';

    $private_key_file = "MY_PRIVATE_KEY_FILE.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;

?>

J'ai essayé avec le nom de domaine et le nom de famille pour l'url de téléchargement mais sans résultat, c'est-à-dire que j'ai essayé les deux formats d'url.

$download_url = "MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3" 
$download_url = "MY_DOWNLOAD_CNAME/download/2012/01/FILE_NAME.mp3" 

mais aucun ne fonctionne. Quelqu'un peut-il m'aider à ce sujet ? Je suis sûr que quelque chose de très petit manque ici ou quelque chose doit être fait avec les paramètres de seau mais aucune idée de ce qu'il faut faire maintenant . besoin d'aide urgente

4voto

Joy Points 9421

Vous devez également ajouter le protocole (http:// ou https://) dans votre URL de téléchargement. Car la signature avec et sans cela serait différente. Il se peut que le backend Cloud Front génère la signature en utilisant l'URL complète (avec http:// ou https://) et que la signature ne corresponde pas à la vôtre et que vous obteniez une erreur d'accès refusé.

Faites votre url de téléchargement comme suit,

$download_url = "http://MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3"

ou pour https://

$download_url = "https://MY_DOMAIN_NAME/download/2012/01/FILE_NAME.mp3"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X