当前位置: 首页 > 面试题库 >

通过AWS开发工具包创建签名的S3和Cloudfront URL

云光明
2023-03-14
问题内容

是否有人成功使用AWS开发工具包为S3存储桶中的对象生成签名URL,该URL也可以在CloudFront上运行?我使用的是JavaScriptAWS开发工具包,通过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访问任何文件,Amazon似乎忽略了我链接中的签名。阅读更多内容后,我发现人们会生成一个.pem文件来获取与CloudFront一起使用的已签名URL,但是为什么S3不需要这样做呢?似乎getSignedUrl方法只是使用AWS密钥和AWS访问密钥进行签名。有人有没有像这样工作过的设置?

更新: 经过进一步研究,CloudFront处理的URL签名似乎与S3link完全不同。但是,对于如何使用Javascript创建签名的CloudFront URL,我仍然不清楚。


问题答案:

更新: 我将签名功能从下面的示例代码移到了NPM上的aws-cloudfront-
sign
软件包中。这样,您只需要此程序包并致电即可getSignedUrl()

经过进一步的研究,我找到了一种解决方案,该解决方案是此答案与我在Boto库中找到的方法之间的组合。确实,S3URL签名与CloudFrontURL签名的处理方式不同。如果您只需要签名S3链接,那么我最初的问题中的示例代码将对您很好。但是,如果您要生成利用CloudFront发行版的签名URL,它将变得更加复杂。这是因为AWSSDK当前不支持CloudFrontURL签名,因此您必须自己创建签名。如果您还需要执行此操作,请执行以下基本步骤。我假设您已经有一个S3存储桶设置:

配置CloudFront

  1. 创建一个CloudFront发行版
  2. 使用以下设置配置您的来源
    • 原始域名:{your-s3-bucket}
    • 限制存储桶访问:是
    • 授予存储桶读取权限:是,更新存储桶策略
  3. 创建CloudFront密钥对。应该可以在这里做到这一点。

创建签名的CloudFront URL

要获得一个经过签名的CloudFront URL,您只需要使用RSA-
SHA1签署您的策略并将其包含为查询参数即可。您可以在此处找到有关自定义策略的更多信息,但是我在下面的示例代码中包含了一个基本的自定义策略,可以帮助您正常运行。该示例代码适用于Node.js,但是该过程可以应用于任何语言。

var crypto = require('crypto')
  , fs = require('fs')
  , util = require('util')
  , moment = require('moment')
  , urlParse = require('url')
  , cloudfrontAccessKey = '<your-cloudfront-public-key>'
  , expiration = moment().add('seconds', 30)  // epoch-expiration-time

// Define your policy.
var policy = {
   'Statement': [{
      'Resource': 'http://<your-cloudfront-domain-name>/path/to/object',
      'Condition': {
         'DateLessThan': {'AWS:EpochTime': '<epoch-expiration-time>'},
      }
   }]
}

// Now that you have your policy defined you can sign it like this:
var sign = crypto.createSign('RSA-SHA1')
  , pem = fs.readFileSync('<path-to-cloudfront-private-key>') 
  , key = pem.toString('ascii')

sign.update(JSON.stringify(policy))
var signature = sign.sign(key, 'base64')

// Finally, you build the URL with all of the required query params:
var url = {
  host: '<your-cloudfront-domain-name>',
  protocol: 'http',
  pathname: '<path-to-s3-object>'
}    
var params = {
  'Key-Pair-Id=' + cloudfrontAccessKey,
  'Expires=' + expiration,
  'Signature=' + signature
}
var signedUrl = util.format('%s?%s', urlParse.format(url), params.join('&'))

return signedUrl


 类似资料:
  • 问题内容: 我正在使用NodeJS AWS开发工具包生成预签名的S3 URL。该文档提供了一个生成预签名URL的示例。 这是我的确切代码(省略了敏感信息): 生成的URL如下所示: 我正在将该URL复制到浏览器中,并得到以下响应: 我知道水桶存在。当我通过AWS Web GUI导航至该项目并双击时,它会打开带有URL的对象,并且工作正常: 因此,我被认为是我使用SDK的方式一定做错了。 问题答案:

  • 我需要使用aws sdk从ECS容器中读取s3 bucket中的文件。最好的选择是什么?。我尝试使用默认的aws creds give初始化aws客户端,但没有成功。我跟着https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ec2-iam-roles.html但InstanceProfileCredentialsProvi

  • 尝试使用AWS JS SDK上传mp4文件并启动多部分上传,当我尝试下载并在本地播放时,我不断收到文件损坏错误。 我的代码要点: > 使用以下参数启动多部分上载: 打电话: 执行分块:参数: 读取文件: 上传每个区块: 最后完成multipartUpload: s3实例。completeMultipartUpload(完成MultipartParams,函数(错误,数据) 我猜问题是我如何读取文件

  • 使用说明 概述 轻推JAVA-SDK是轻推开放平台面向Java开发者提供的发工具包。通过使用轻推JAVA-SDK,Java开发者可借助轻推高效地使用消息推送,安全登录等功能。 此文档面向Java开发者介绍轻推JAVA-SDK如何使用及相关注意事项。 使用步骤 步骤一:获取AppID以及AppSecret 登录轻推企业管理系统,编辑轻应用/订阅号,获取AppID以及AppSecret,若需要使用轻推

  • 我尝试使用EMR工件存储库将emrfs-hadoop-assembly及其依赖项打包到应用程序中。 我查看了想通过Maven/Gradle获取的jar的pom.xml,得到了artifactId和groupId,但构建工具无法解决这些问题。