2

例外:我想使用我的 AWS CloudFront url 获取签名的 url。

我做了什么:我创建了一个 AWS CloudFront 实例并启用了Restrict Viewer Access功能,Trusted Signers is Self

下面是我要签名的 url 的 php 代码

function getSignedURL()
{
    $resource = 'http://d2qui8qg6d31zk.cloudfront.net/richardcuicks3sample/140-140.bmp'; 
    $timeout = 300;       

    //This comes from key pair you generated for cloudfront
    $keyPairId = "YOUR_CLOUDFRONT_KEY_PAIR_ID";

    $expires = time() + $timeout; //Time out in seconds
    $json = '{"Statement":[{"Resource":"'.$resource.'","Condition":{"DateLessThan":{"AWS:EpochTime":'.$expires.'}}}]}';             

    //Read Cloudfront Private Key Pair
    $fp=fopen("private_key.pem","r"); 
    $priv_key=fread($fp,8192); 
    fclose($fp); 

    //Create the private key
    $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;
}

对于$keyPairIdprivate_key.pem,我登录了我的根帐户并在Security Credentials->CloudFront Key Pairs部分生成了这两个变量。

如果我http://d2qui8qg6d31zk.cloudfront.net/richardcuicks3sample/140-140.bmp直接在浏览器上访问。它会像这样回应

<Error>
  <Code>MissingKey</Code>
  <Message>
    Missing Key-Pair-Id query parameter or cookie value
  </Message>
</Error>

运行函数后,我得到一个长签名的 url,在 chrome 浏览器上解析 url,它会响应如下

<Error>
  <Code>InvalidKey</Code>
  <Message>Unknown Key</Message>
</Error>

问题:我已经搜索 AWS 文档和谷歌很多时间,有人能告诉我为什么会发生这种情况,或者我错过了什么吗?提前致谢!

4

3 回答 3

1

$priv_key=fread($fp,8192);

如果我理解,您生成了密钥。如果是这样,看起来您正在设置不受支持的密钥大小。

  • 密钥对必须是 SSH-2 RSA 密钥对。
  • 密钥对必须采用 base64 编码的 PEM 格式。
  • 支持的密钥长度为 1024、2048 和 4096 位

文档:https ://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs

于 2017-06-07T00:01:55.953 回答
0

感谢@imperalix 回答这个问题。

我已经解决了这个问题,

受此站点启发,我发现我使用了错误的 CloudFront url 进行签名。

之前:http ://d2qui8qg6d31zk.cloudfront.net/richardcuicks3sample/140-140.bmp

之后:http ://d2qui8qg6d31zk.cloudfront.net/140-140.bmp

因为我为richardcuicks3sample 存储桶创建了CloudFront 分配,所以不需要在url 中包含这个存储桶名称。更改网址后,签名的网址运行良好。

于 2017-06-07T02:57:38.477 回答
0

我选择了受信任的密钥组,当我最初认为密钥对 ID 与“我的安全凭证”下的访问密钥 ID 相同时,我得到了无效密钥/未知密钥错误。正确使用的是来自您的公钥的 ID(CloudFront > Key Management > Public Keys)。

于 2021-05-12T04:14:42.370 回答