当前位置: 首页 > 知识库问答 >
问题:

通过AWS SDK创建签名的S3和Cloudfront URL

卫皓
2023-03-14
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)
})

共有1个答案

房学文
2023-03-14

更新:我将签名功能从下面的示例代码移到了NPM上的aws-cloudfront-sign包中。这样,您就可以只需要这个包并调用getSignedURL()

经过进一步的研究,我找到了一个解决方案,它是这个答案和我在Boto库中找到的方法的组合。确实,S3 URL签名的处理方式不同于CloudFront URL签名。如果您只需要签署一个S3链接,那么我最初问题中的示例代码将非常适合您。但是,如果您希望生成使用CloudFront发行版的签名URL,则会变得稍微复杂一些。这是因为AWS SDK当前不支持CloudFront URL签名,所以您必须自己创建签名。如果您也需要这样做,下面是基本步骤。我假设您已经有了一个S3 bucket设置:

  • 创建CloudFront发行版
  • 使用以下设置配置您的原点
    • 来源域名:{your-s3-bucket}
    • 限制存储桶访问:是
    • 授予桶的读取权限:是,更新桶策略
    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
    

 类似资料:
  • 问题内容: 是否有人成功使用AWS开发工具包为S3存储桶中的对象生成签名URL,该URL也可以在CloudFront上运行?我使用的是JavaScriptAWS开发工具包,通过S3链接生成签名的URL非常简单。我刚刚创建了一个私有存储桶,并使用以下代码生成URL: 这很好用,但我也想向用户公开一个CloudFront URL,以便他们可以提高使用CDN的下载速度。我设置了一个CloudFront发

  • 我试图使用以下工作流程创建PAdES签名: PDF准备签名,哈希在浏览器中计算 哈希发送到后端 后端形成分离的CAdES签名 分离的CAdES被发送回组装PAdES签名的浏览器 我们有一个PDF签名的工作示例,其工作原理如下: 准备好PDF,并在浏览器中计算哈希值 这很好用。 然而,现在我们在后端使用DSS库,而不是BouncyCastle,因为我们正在尝试创建PAdES签名。因此,DSS lib

  • 是否可以使用存储在Azure密钥库中的X509证书创建RSA-SHA1签名?“不可抵赖证明书” 不幸的是,我不能将哈希算法更改为SHA256或更安全的东西,我真的需要将证书作为密钥存储在Azure Key Vault中。 null

  • 数字签名允许我们验证签名的作者,日期和时间,验证消息内容。 它还包括用于其他功能的身份验证功能。 数字签名的优点 在本节中,我们将了解要求使用数字签名的不同原因。 将数字签名实施到通信有几个原因 - 身份验证 (Authentication) 数字签名有助于验证消息来源。 例如,如果银行的分支机构向中央办公室发送消息,请求更改帐户余额。 如果中央办公室无法验证从授权来源发送的消息,则执行此类请求可

  • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?

  • 我正在尝试验证使用BearSSL在嵌入式设备上使用OpenSSL创建的ECDSA签名。 首先,我使用OpenSSL创建了一个私钥并提取了公钥: 然后我提取了原始公钥: 我有一个,它只包含,并使用以下命令对此进行签名: 现在,它包含ASN1格式的签名,长度如预期的那样为72个字节: 现在到嵌入部分。我首先包括数据、签名和公钥: 此外,出于偏执,我比较了和我的字符串的md5和,然后再进行进一步的快速检