我怎么知道签名网址的签名?

Posted

技术标签:

【中文标题】我怎么知道签名网址的签名?【英文标题】:How I know the signature of a signed url? 【发布时间】:2020-08-25 00:37:19 【问题描述】:

我有一个 lambda,它为用户生成一个签名 URL,以将文件上传到 s3 存储桶。代码在nodejs中:

export const getSignedURL = async (): Promise< signedURL: string > => 
  try 
    const s3 = new S3();
    const params = 
      Bucket: CONFIG.s3Bucket,
      Key: `$CONFIG.s3PictureFolder/$uuidv4()`,
      Expires: CONFIG.presignedURLExpires,
    ;
    const signedURL = await s3.getSignedUrlPromise('putObject', params);
    console.log(`generate signedURL url: $signedURL`);
    return  signedURL ;
   catch (err) 
    console.error(err);
    throw err;
  
;

我能够获得 url 成功。但是,当我通过curl 测试它时:

curl -XPUT PRESIGNED_URL --data "my data"

我收到了这个错误:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>XXXX</AWSAccessKeyId><StringToSign>

这个 URL 似乎需要访问密钥。此密钥是否表示由 IAM 颁发的 AWS 凭证密钥?

此 URL 由 lambda 函数生成。我怎么知道它使用哪个键?我想生成一个公开的预签名网址供用户上传。有没有办法做到这一点?

【问题讨论】:

你能告诉我们签名的 URL 是什么样的吗? (随意修改它以隐藏个人信息。)它应该包含所有必要的信息。 不,您的 AWS 凭证在生成 URL 时使用,但一旦创建,该 URL 是“公共的” - 任何人都可以使用它,无需额外的密钥。有几个可能的原因,但最有可能是存储桶或键值中的简单格式/编码问题。 【参考方案1】:

经过调试,发现生成预签名URL时需要添加Content-Type

const params = 
      Bucket: CONFIG.s3Bucket,
      Key: `$CONFIG.s3PictureFolder/$uuidv4()`,
      Expires: CONFIG.presignedURLExpires,
      ContentType: 'text/plain'
    ;

【讨论】:

以上是关于我怎么知道签名网址的签名?的主要内容,如果未能解决你的问题,请参考以下文章

Android Volley Self签名证书

新浪微盘账户关联登录

QQ个性签名修改不了了 怎么回事

你知道数字签名吗?

如何查看APK的MD5签名

从命令行确定代码签名身份?