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文档并且谷歌了很多时间,有人可以告诉我为什么会发生这种情况或者我错过了什么?提前谢谢!
答案 0 :(得分:0)
$ priv_key =的fread($ FP,8192);
如果我理解,你生成了密钥。如果是这样,看起来您正在设置不受支持的密钥大小。
答案 1 :(得分:0)
感谢@imperalix回答这个问题。
我已经解决了这个问题,
受此site的启发,我发现我使用了错误的CloudFront网址进行签名。
之前:http://d2qui8qg6d31zk.cloudfront.net/richardcuicks3sample/140-140.bmp
之后:http://d2qui8qg6d31zk.cloudfront.net/140-140.bmp
因为我为richardcuicks3sample存储桶创建了CloudFront分配,所以不需要在网址中包含此存储桶名称。我更改了网址后,签名的网址运行良好。
答案 2 :(得分:0)
我能够使用以下步骤解决问题:
https://www.lazydeveloper.tech/aws/aws-cloudfront-invalidkey-unknown-key-when-using-signed-urls/
答案 3 :(得分:0)
我选择了受信任的密钥组,当我最初认为密钥对 ID 与“我的安全凭证”下的访问密钥 ID 相同时,我收到了无效密钥/未知密钥错误。正确使用的是来自您的公钥的 ID(CloudFront > 密钥管理 > 公钥)。