是否有人成功使用AWS SDK生成S3存储桶中对象的签名URL,这些URL也可以在CloudFront上运行?我正在使用JavaScript AWS SDK),通过S3链接生成签名URL非常简单 . 我刚刚创建了一个私有存储桶并使用以下代码生成URL:
var AWS = require('aws-sdk')
, s3 = new AWS.S3()
, params = {Bucket: 'my-bucket', Key: 'path/to/key', Expiration: 20}
s3.getSignedUrl('getObject', params, function (err, url) {
console.log('Signed URL: ' + url)
})
这很好但我也希望向用户公开CloudFront URL,以便他们可以获得使用CDN的更高下载速度 . 我设置了一个CloudFront发行版,它修改了存储桶策略以允许访问 . 但是,执行此操作后,任何文件都可以通过CloudFront URL访问,而亚马逊似乎忽略了我的链接中的签名 . 在阅读了更多内容后,我发现有人生成一个.pem文件来获取使用CloudFront的签名URL,但为什么S3不需要这样做?似乎getSignedUrl方法只使用AWS Secret Key和AWS Access Key进行签名 . 有没有人得到过这样的设置呢?
Update: 经过进一步研究后,CloudFront似乎处理的URL签名完全不同于S3 [link] . 但是,我仍然不清楚如何使用Javascript创建签名的CloudFront URL .
2 回答
Update: 我将签名功能从下面的示例代码移到了NPM上的aws-cloudfront-sign包中 . 这样你就可以只需要这个包并调用
getSignedUrl()
.经过一些进一步的调查后,我找到了一个解决方案,它是this answer与我在Boto library中找到的方法之间的一种组合 . 确实,S3 URL签名的处理方式与CloudFront URL签名不同 . 如果您只需要签署一个S3链接,那么我的初始问题中的示例代码将适用于您 . 但是,如果要生成使用CloudFront分配的签名URL,则会更复杂一些 . 这是因为AWS SDK当前不支持CloudFront URL签名,因此您必须自己创建签名 . 如果您还需要这样做,这里是基本步骤 . 我假设您已经安装了S3存储桶:
配置CloudFront
创建CloudFront分配
使用以下设置配置原点
Origin域名:
限制存储桶访问:是
授予存储桶读取权限:是,更新存储桶策略
创建CloudFront密钥对 . 应该可以这样做here .
创建签名的CloudFront URL
要想使用签名的CloudFront URL,您只需使用RSA-SHA1签署策略并将其作为查询参数包含在内 . 您可以在自定义策略here上找到更多信息,但我在下面的示例代码中包含了一个基本的策略,可以让您启动并运行 . 示例代码适用于Node.js,但该过程可以应用于任何语言 .
为了使我的代码能够使用Jason Sims的代码,我还必须将策略转换为base64并将其添加到最终的signedUrl中,如下所示: