使用php SDK为aws cloudfront https设置签名cookie

使用php SDK为aws cloudfront https设置签名cookie,php,cookies,https,amazon-cloudfront,aws-sdk,Php,Cookies,Https,Amazon Cloudfront,Aws Sdk,我正在通过cloudfront建立一个HLS流媒体服务,并为内容保护实施一些安全措施。我已经成功地使它在http下工作,我可以流式传输视频,并在我的网站上观看它与许多内容保护安全措施。有关我如何使它为http工作的更多详细信息,您可以在我在drupal.org上发表的一篇文章中查阅 但是现在我需要将https添加到公式中,因为hls加密段的一些加密密钥正在传输,但我遇到了问题。现在我正在努力将https添加到公式中。我已经向我的站点添加了一个证书,并且在cludfront中添加了另一个证书,因为

我正在通过cloudfront建立一个HLS流媒体服务,并为内容保护实施一些安全措施。我已经成功地使它在http下工作,我可以流式传输视频,并在我的网站上观看它与许多内容保护安全措施。有关我如何使它为http工作的更多详细信息,您可以在我在drupal.org上发表的一篇文章中查阅

但是现在我需要将https添加到公式中,因为hls加密段的一些加密密钥正在传输,但我遇到了问题。现在我正在努力将https添加到公式中。我已经向我的站点添加了一个证书,并且在cludfront中添加了另一个证书,因为我的证书不是通配符证书

我的站点证书适用于subdomain.mydomain.com

我的cloudfront证书适用于*.mydomain.com

我的cloudfront发行版的cname为cdn.mydomain.com

创建cookie时,我在调用中将secure参数设置为true(域后的第6个参数):

但是当我尝试访问我的站点中的一些测试数据时

if (readfile('https://cdn.mydomain.com/privacy_test.txt')==0)
    print "Error in cdn access";
我在我的网站上看不到文件的内容,但看到了错误消息


因此,我似乎需要做更多的事情才能使cloudfront aws签名的cookies在https下工作。有什么帮助吗?

只需设置
setcookie()
$secure
参数不会创建签名cookie。创建签名cookie的过程有点复杂。首先,回顾,特别是罐装定制政策部分。你需要熟悉你自己

利用中概述的代码示例,然后在我的一些应用程序中使用以下代码来设置cookie:

public static function getCustomSignedCookies()
{
    $domain = '.' . explode('.', apache_request_headers()['Host'], 2)[1];
    $dt = new DateTime();
    $dt->add(new DateInterval('P1Y')); // 1 year
    $expires = $dt->getTimestamp();
    $url = Config::get('cloudfront_url') . '/*';
    $policy = self::getCustomPolicy($url, $expires);
    $encodedPolicy = self::url_safe_base64_encode($policy);
    $signature = self::getSignature($policy);

    $cookies = [
        [
            'name' => 'CloudFront-Policy'
            , 'value' => $encodedPolicy
            , 'expires' => $expires
            , 'path' => '/'
            , 'domain' => $domain
            , 'secure' => true
            , 'httpOnly' => true
        ],
        [
            'name' => 'CloudFront-Signature'
            , 'value' => $signature
            , 'expires' => $expires
            , 'path' => '/'
            , 'domain' => $domain
            , 'secure' => true
            , 'httpOnly' => true
        ],
        [
            'name' => 'CloudFront-Key-Pair-Id'
            , 'value' => self::$keyPair
            , 'expires' => $expires
            , 'path' => '/'
            , 'domain' => $domain
            , 'secure' => true
            , 'httpOnly' => true
        ]
    ];

    return $cookies;
}

public static function setCloudFrontCookies()
{
    ob_start();

    foreach (self::getCustomSignedCookies() as $cookie)
    {
        setcookie
        (
            $cookie['name']
            , $cookie['value']
            , $cookie['expires']
            , $cookie['path']
            , $cookie['domain']
            , $cookie['secure']
            , $cookie['httpOnly']
        );
    }

    ob_end_flush();
}
public static function getCustomSignedCookies()
{
    $domain = '.' . explode('.', apache_request_headers()['Host'], 2)[1];
    $dt = new DateTime();
    $dt->add(new DateInterval('P1Y')); // 1 year
    $expires = $dt->getTimestamp();
    $url = Config::get('cloudfront_url') . '/*';
    $policy = self::getCustomPolicy($url, $expires);
    $encodedPolicy = self::url_safe_base64_encode($policy);
    $signature = self::getSignature($policy);

    $cookies = [
        [
            'name' => 'CloudFront-Policy'
            , 'value' => $encodedPolicy
            , 'expires' => $expires
            , 'path' => '/'
            , 'domain' => $domain
            , 'secure' => true
            , 'httpOnly' => true
        ],
        [
            'name' => 'CloudFront-Signature'
            , 'value' => $signature
            , 'expires' => $expires
            , 'path' => '/'
            , 'domain' => $domain
            , 'secure' => true
            , 'httpOnly' => true
        ],
        [
            'name' => 'CloudFront-Key-Pair-Id'
            , 'value' => self::$keyPair
            , 'expires' => $expires
            , 'path' => '/'
            , 'domain' => $domain
            , 'secure' => true
            , 'httpOnly' => true
        ]
    ];

    return $cookies;
}

public static function setCloudFrontCookies()
{
    ob_start();

    foreach (self::getCustomSignedCookies() as $cookie)
    {
        setcookie
        (
            $cookie['name']
            , $cookie['value']
            , $cookie['expires']
            , $cookie['path']
            , $cookie['domain']
            , $cookie['secure']
            , $cookie['httpOnly']
        );
    }

    ob_end_flush();
}