I’m trying to generate a signed URL using AWS CloudFront to access images stored on AWS S3.
Here’s the code snippet to retrieve the private key.
defp load_private_key() do
System.get_env("AWS_PRIVATE_KEY")
|> Base.decode64!()
|> :public_key.pem_decode()
|> hd()
|> :public_key.pem_entry_decode()
end
And here’s the code snippet to generate the signed URL.
defp generate_cloudfront_signed_url(s3_object_key) do
private_key = load_private_key()
key_pair_id = System.get_env("AWS_KEY_PAIR_ID")
# Generate CloudFront signed URL
generate_cloudfront_signed_url(s3_object_key, private_key, key_pair_id)
end
defp generate_cloudfront_signed_url(s3_object_key, private_key, key_pair_id) do
url = get_object_url(s3_object_key)
expires_when = calculate_expiration_in_unix_time()
policy = create_custom_policy(url, expires_when)
signature = :public_key.sign(policy, :sha, private_key)
# signature = :crypto.sign(:rsa, :sha, policy, private_key)
encoded_signature = Base.url_encode64(signature)
"#{url}?Expires=#{expires_when}&Signature=#{encoded_signature}&Key-Pair-Id=#{key_pair_id}"
end
However, when accessing the generated URL, I always encounter an error.
<Error>
<Code>MalformedSignature</Code>
<Message>Could not unencode Signature</Message>
</Error>
If anyone has experience working with CloudFront and S3, please help me out. Thank you very much.