AWS无法签署CloudFront网址

时间:2017-06-06 10:46:25

标签: amazon-web-services amazon-s3 amazon-cloudfront pre-signed-url

Excepted :我希望使用我的AWS CloudFront网址获取已签名的网址。

我做了什么:我创建了一个AWS CloudFront instence并启用了限制查看器访问功能,可信签名者 Self

下面是我要签署网址的PHP代码

>>> from decimal import *
>>> getcontext().prec = 100
>>> d1 = Decimal(2).sqrt()
>>> d1
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573')

对于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; } $keyPairId,我登录了我的root帐户,并在 Security Credentials-&gt; CloudFront Key Pairs 部分生成了这两个变量。

如果我直接在浏览器上访问private_key.pem。它会像

一样回应
http://d2qui8qg6d31zk.cloudfront.net/richardcuicks3sample/140-140.bmp

运行该功能后,我获得了一个长签名网址,在Chrome浏览器上解析网址,它会像

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

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

4 个答案:

答案 0 :(得分:0)

  

$ 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

答案 1 :(得分:0)

感谢@imperalix回答这个问题。

我已经解决了这个问题,

受此site的启发,我发现我使用了错误的CloudFront网址进行签名。

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

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

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

答案 2 :(得分:0)

我能够使用以下步骤解决问题:

  1. 转到 Cloudfront 分发版
  2. 点击“行为”标签
  3. 选中复选框并点击编辑
  4. 在可信密钥组或可信签名者单选按钮中选择可信签名者
  5. 点击保存

https://www.lazydeveloper.tech/aws/aws-cloudfront-invalidkey-unknown-key-when-using-signed-urls/

答案 3 :(得分:0)

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