S3 预签名上传 url 错误

Posted

技术标签:

【中文标题】S3 预签名上传 url 错误【英文标题】:S3 presigned upload url error 【发布时间】:2018-12-24 20:56:31 【问题描述】:

我正在尝试使用 S3 预签名的 PUT url 执行文档上传。我使用 java AWS SDK (GeneratePresignedUrlRequest.java) 生成了 url。此 url 生成代码位于 AWS API 网关后面的 lambda 函数中。

但是,当我在 Postman 中复制生成的 url 并尝试执行上传时,出现以下错误。

<Error>
<Code>AccessDenied</Code>
<Message>
There were headers present in the request which were not signed
</Message>
<HeadersNotSigned>host</HeadersNotSigned>
<RequestId>6E624EC66091A099</RequestId>
<HostId>
9HnUUZpa9zUWfyzuNrZtRkoN2CYxH8V6rqx5QgsMFC6foTZKuG5qmZL5ThnUXooYPk2reFzKKUg=
</HostId>
</Error>

生成的url是“https://bucket>.s3.amazonaws.com/key>?X-Amz-Security-Token=>&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20180718T013339Z&X-Amz-SignedHeaders =content-type%253Bhost&X-Amz-Expires=1799&X-Amz-Credential=>&X-Amz-Signature=值 em>>

关于在生成 url 时需要更正的内容有什么建议吗?

【问题讨论】:

【参考方案1】:

该错误确实与“缺少标头”有关,但与具有误导性的“主机”无关。 X-Amz-SignedHeaders=content-type%253Bhost 中 'host' 之前的值 'content-type' 需要在以下情况下显式提供为请求标头http 客户端使用预签名的 url 将文件上传到 S3。

我在java中生成了预签名的url为

GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName,objectKey).withMethod(HttpMethod.PUT).withContentType("application/pdf").withExpiration(expiration);

因此,据我所知,S3 期望 content-type'application/pdf' 成为预签名 url 请求的一部分,作为签名匹配的标头.

【讨论】:

以上是关于S3 预签名上传 url 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用预签名 URL 上传到 S3 存储桶会出现 403 禁止错误

使用预签名 URL 将文件上传到 Amazon S3 时出现 CORS 错误

仅从浏览器使用预签名 URL 上传时出现 AWS S3 CORS 错误

带有预签名 URL 和 CORS 问题的 S3 上传

使用预签名的 url PUT 到 S3 会出现 403 错误

使用预签名的 url 将文件发送到 s3 存储桶会出现 403 错误 (SignatureDoesNotMatch)