【问题标题】:cloudfront signed urls ip address云端签名的 urls ip 地址
【发布时间】:2012-10-18 19:05:43
【问题描述】:

我在 Cloudfront 上的签名 URL 在 PHP 中运行良好。存储桶策略适用于 S3 上的 HTTP 引荐来源网址,但由于 Cloudfront 不支持 HTTP 引荐来源网址检查,我只需将文件提供给一个 IP 地址(理想情况下是请求文件并生成签名 URL 的客户端或我的 Web 服务器)。

有人可以帮我将 IP 地址元素添加到 JSON 代码中以使其正常工作吗?

"IpAddress":{"AWS:SourceIp":"192.0.2.0/24"},

我对 PHP 和政策声明一头雾水,但认为对于知道的人来说可能很容易:http://tinyurl.com/9czr5lp

它对自定义策略的编码/签名略有不同:http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-content-custom-policy-statement

以下是一个 AWS 示例,除了 IP 地址锁定之外,它都可以工作。

如果有人可以帮我两分钟,我可以很快测试这个!

非常感谢您的帮助:)

乔恩

    function getSignedURL($resource, $timeout)
    {
        $keyPairId = "XXXXXXXXXXXX";
        $expires = time() + $timeout;
        $json = '{"Statement":[{"Resource":"'.$resource.'","Condition":{"DateLessThan":     {"AWS:EpochTime":'.$expires.'}}}]}';
        $fp=fopen("pk-XXXXXXXX.pem","r");

        $priv_key=fread($fp,8192);
        fclose($fp);

        $key = openssl_get_privatekey($priv_key);
        if(!$key)
        {
                echo "<p>Failed to load private key!</p>";
                return;
        }

        //Sign the policy with the private key

        if(!openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1))
        {
                echo '<p>Failed to sign policy: '.openssl_error_string().'</p>';
                return;
        }
        //Create url safe signed policy
        $base64_signed_policy = base64_encode($signed_policy);
        $signature = str_replace(array('+','=','/'), array('-','_','~'), $base64_signed_policy);
        //Construct the URL
        $url = $resource.'?Expires='.$expires.'&Signature='.$signature.'&Key-Pair-Id='.$keyPairId;
        return $url;
}
$url = getSignedURL("http://s675765.cloudfront.net/filename.mp4", 600);
print $url;

【问题讨论】:

    标签: php json amazon-s3 amazon-web-services amazon-cloudfront


    【解决方案1】:
    {"Statement":[{"Resource":"testRes","Condition":{"DateLessThan":{"AWS:EpochTime":1357034400},"IpAddress":{"AWS:SourceIp":"192.0.2.0\/24"}}}]}
    

    这是一个包含填充值和转义值的有效 JSON 字符串。 如果您将 IP 地址作为变量传递,请确保您转义 /

    例如

    $escapedIp = str_replace( '/', '\/', $ipAddress );
    

    看看 php json 扩展 这会让事情变得更容易:

    php 数组的示例语句

    $statement = array( 
        'Statement' => array( 
            array(
                'Resource' => $resource, 
                'Condition' => array( 
                    'DateLessThan' => array( 
                        'AWS:EpochTime' => $expires 
                    ),
                    'IpAddress' => array( 
                        'AWS:SourceIp' => $ipAddress 
                    ) 
                ) 
            )
        ) 
    );
    
    $json = json_encode( $statement );
    

    【讨论】:

    • 这有点太复杂了,无法在评论中解释。通常,您只需通过将最后一段截断为 0 并添加 /24 八进制掩码来允许完整的 0-255 范围。例如 10.0.0.1-10.0.0.255 将是 10.0.0.0/24。有关 CIDR 的一般信息,请参阅 en.m.wikipedia.org/wiki/Classless_Inter-Domain_Routing
    • 任何将 IP 即 114.235.149.30 转换为 CIDR 格式的 php 函数 ???或者我可以在签名 url 时只使用 1 个单个 ip 114.235.149.30 吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2011-10-22
    • 2014-03-14
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多