我已完成以下步骤:
Python 代码:(与 https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudfront.html 相同)
import datetime
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from botocore.signers import CloudFrontSigner
def rsa_signer(message):
with open('path/to/key.pem', 'rb') as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1())
key_id = 'AKIAIOSFODNN7EXAMPLE'
url = 'http://d2949o5mkkp72v.cloudfront.net/hello.txt'
expire_date = datetime.datetime(2022, 10, 11)
cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)
# Create a signed url that will be valid until the specific expiry date
# provided using a canned policy.
signed_url = cloudfront_signer.generate_presigned_url(
url, date_less_than=expire_date)
print(signed_url)
我尝试对签名部分进行 Base64 解码,但它给出了类似输入流中无效字符的错误。 我的另一个问题是,我可以为同一个对象创建多个签名网址吗? 当我们没有限制查看者访问 = 是时,签名的 URL 可以正常工作。我知道没关系,cos 签名的 url 应该在限制访问的情况下工作。
我还尝试使用 Perl 创建签名 URL,并使用 AWS 提供的代码,但即使这样也不起作用。相同的访问被拒绝。
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CreateURLPerl.html
就像生活中的许多事情一样,这是一个小错误。
我错过了在 URL 中添加尾随 / 的问题。
我已经使用了与您建议的相同的逻辑,但它仅适用于某些键,并且不适用于具有空格的键。你对此有什么解决办法吗?我已经在 Stack Overflow 上询问过这个问题。这是问题的链接:[]