【问题标题】:Download objects (files) using presigned url in AWS S3 doesn't work在 AWS S3 中使用预签名 url 下载对象(文件)不起作用
【发布时间】:2022-02-05 03:44:33
【问题描述】:

我使用服务器端加密和客户提供的密钥 (SSE-C) 上传了加密对象。 是否可以在 AWS S3 中使用预签名 URL 下载对象?

我试过这样

GeneratePresignedUrlRequest generatePresignedUrlRequest1 = new GeneratePresignedUrlRequest("bucketname", "objectpath")
       .withMethod(HttpMethod.GET)
       .withSSECustomerKey(new SSECustomerKey("base64mykey"))
       .withExpiration(new Date( System.currentTimeMillis() + (60 * 60 * 1000)));

链接已生成,但在浏览器中访问时出现此错误The request signature we calculated does not match the signature you provided. Check your key and signing method. 是否有解决方案?

【问题讨论】:

    标签: java amazon-web-services amazon-s3 download


    【解决方案1】:

    带有预签名 URL 的 SSE-C 可能无法按您预期的方式工作。

    请求签名算法的输入包括所有以x-amz-* 开头的标头。这很重要,原因稍后会变得更清楚。

    当您实际发出请求时,生成签名的代码需要知道这些值是什么,这是唯一.withSSECustomerKey() 所做的事情——提供签名算法需要的信息,以便签名与您最终发送的实际请求相匹配。

    加密密钥实际上并未嵌入到预签名 URL 中。它需要在实际发出请求时再次提供。

    使用客户提供的加密密钥 (SSE-C) 进行服务器端加密时,您必须使用以下请求标头提供加密密钥信息。

    x-amz-server-side​-encryption​-customer-algorithm 使用此标头指定加密算法。标头值必须为AES256

    x-amz-server-side​-encryption​-customer-key 使用此标头为 Amazon S3 提供 256 位、base64 编码的加密密钥,用于加密或解密您的数据。

    x-amz-server-side​-encryption​-customer-key-MD5 使用此标头根据 RFC 1321 提供加密密钥的 base64 编码的 128 位 MD5 摘要。Amazon S3 使用此标头进行消息完整性检查,以确保加密密钥的传输没有错误。

    https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html

    因此,您可以使用来自服务器的预签名 URL,使用 HTTP 客户端库(通过将这些标头与请求一起注入),或者您可以从 Javascript 的浏览器中使用它,类似地,或使用 Postman 和 Curl 等工具,但是您不能将其用作可单击或可粘贴的超链接,因为 URL 不提供指定 HTTP 标头的方法。而且,当然,从浏览器端 JS 中使用它似乎也是一个坏主意,因为这会以明文形式显示加密密钥......所以如果你打算下载一个使用 SSE-C 存储的对象,那就是无论如何,只适用于安全环境,因为需要明文处理密钥。

    【讨论】:

      【解决方案2】:

      好的,但是用卷曲石灰这个:

      curl -v -T ${S3_UPLOAD_FILE} https://$S3_BUCKET.s3.amazonaws.com/${S3_DESTINATION_FILE} -H“日期:${S3_DATE}”-H“授权:AWS ${S3_KEY}: ${S3_SIGNATURE}" -H "内容类型:${S3_CONTENT_TYPE}" -H "内容 MD5:${S3_MD5SUM}" -H "x-amz-server-side-encryption-customer-algorithm:${S3_SSEC_ALGORITHM} " -H "x-amz-server-side-encryption-customer-key:${S3_ENCRYPTION_KEY}" -H "x-amz-server-side-encryption-customer-key-MD5:${S3_ENCRYPTION_MD5}"

      我可以使用 sse-c 密钥将文件上传到 s3 存储桶。下载呢?

      【讨论】:

      • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 2021-02-15
      • 2020-10-23
      • 2021-03-19
      • 2020-01-15
      相关资源
      最近更新 更多