AWS не может подписывать URL-адреса CloudFront
Исключено: я хочу получить подписанные URL-адреса с помощью своего URL-адреса AWS CloudFront.
Что я сделал: я создал инстинкт AWS CloudFront и включил функцию " Ограничить доступ зрителя", " Доверенные подписчики" - это " Я".
Ниже приведен код PHP, который я хочу подписать URL
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
а также private_key.pem
Я вошел в свою учетную запись root и сгенерировал эти две переменные в разделе 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, проанализировал URL в браузере Chrome, он ответит как
<Error>
<Code>InvalidKey</Code>
<Message>Unknown Key</Message>
</Error>
Вопрос: У меня есть поиск по документу AWS и я много гуглю об этом. Может ли кто-нибудь сказать мне, почему это произошло или я что-то пропустил? Заранее спасибо!
4 ответа
$ Priv_key= Fread($ ∥f∥p,8192);
Если я понимаю, вы сгенерировали ключ. Если это так, похоже, вы устанавливаете размер ключа, который не поддерживается.
- Пара ключей должна быть парой ключей SSH-2 RSA.
- Пара ключей должна быть в формате PEM в кодировке base64.
- Поддерживаемые длины ключей 1024, 2048 и 4096 бит
Я выбрал группы доверенных ключей и получил ошибку invalidkey/unknownkey, когда изначально думал, что идентификатор пары ключей совпадает с идентификатором ключа доступа в разделе «Мои учетные данные безопасности». Правильно использовать этот идентификатор из ваших открытых ключей (CloudFront> Управление ключами> Открытые ключи).
Спасибо @imperalix за ответ на этот вопрос.
Я решил эту проблему,
Вдохновленный этим сайтом, я обнаружил, что использовал неверный URL-адрес CloudFront для подписи.
До: http://d2qui8qg6d31zk.cloudfront.net/richardcuicks3sample/140-140.bmp
После: http://d2qui8qg6d31zk.cloudfront.net/140-140.bmp
Поскольку я создаю дистрибутив CloudFront для корзины richardcuicks3sample, поэтому не нужно включать это имя корзины в URL. После того, как я изменил URL, подписанный URL работает хорошо.
Мне удалось решить проблему, выполнив следующие действия:
- Перейти к раздаче Cloudfront
- Перейдите на вкладку "Поведение".
- Установите флажок и нажмите Редактировать.
- Выберите Trusted Signer в переключателе Trusted Key Groups или Trusted Signer.
- Нажмите кнопку "Сохранить".
https://www.lazydeveloper.tech/aws/aws-cloudfront-invalidkey-unknown-key-when-using-signed-urls/