如果您需要通过签名 url 执行此操作,您可以使用 AWS.CloudFront.Signer (在 nodejs 中,必须也提供其他语言):
const cloudFront = new AWS.CloudFront.Signer(publicKey, privateKey);
const policy = JSON.stringify({
Statement: [
{
Resource: 'https://*',
Condition: {
DateLessThan: {
'AWS:EpochTime': 1757120800,
},
},
},
],
});
const url = cloudFront.getSignedCookie({
policy,
});
console.log(url);
请注意,公私钥应该是:
- SSH-2 RSA 密钥对。
- 采用 base64 编码的 PEM 格式。
- 2048 位密钥对。
参考:https ://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs
上面的 privateKey 将按原样生成;您不妨从生成的私钥 .pem 文件中读取字符串。然而,公钥将是公钥 ID,而不是公钥本身。在上面的参考资料中,它告诉您如何创建一个密钥组并在那里上传生成的公钥。在上传公钥时,会有一个分配给它的 id。这个 id 需要传递给 AWS.CloudFront.Signer 构造函数的第一个参数。
但是,作为旁注,如果您打算流式传输视频,则不建议使用签名的 url 方法。
原因很简单:您正在流式传输,因为您可能希望更快地加载视频并获得更好的视频体验。签名是 CPU 昂贵的,所以需要一些时间来签署一个字符串(这里,url)(在这里阅读更多事情是如何工作的:https ://en.wikipedia.org/wiki/RSA_(cryptosystem)#Encryption ) .如果这是一次性的事情就好了。但是也需要对每个 .ts url 进行签名。
我在这里解释了如何做到这一点:https ://stackoverflow.com/a/67929204/5657783