如何对 Amazon S3 预签名 URL 请求的“SignatureDoesNotMatch”或“403 Forbidden”(403 禁止访问)错误进行故障排除?

1 分钟阅读
0

我使用 Amazon Simple Storage Service (Amazon S3) 预签名 URL 向我的 Amazon S3 存储桶发出请求,但我收到了“SignatureDoesNotMatch”或“403 Forbidden”(403 禁止访问)错误消息。

简短描述

当您生成预签名 URL 时,客户端会计算一个唯一签名来对请求进行身份验证。然后,Amazon S3 会根据客户端在 HTTP 请求中发送的参数计算一个签名,并比较两个签名。如果签名不匹配,您将会收到“SignatureDoesNotMatch”错误。

解决方法

要对此问题进行故障排除,请检查您的 Amazon S3 预签名 URL 请求的以下配置设置。

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

验证 HTTP 方法

生成预签名 URL 时,您会为该 URL 指定 HTTP 操作。确保客户端在 HTTP 请求中发送的操作与 URL 中的 HTTP 操作相匹配。例如,如果您为该 URL 指定了 GET 操作,则请求中的 HTTP 操作也必须是 GET。

检查秘密访问密钥

检查用于生成预签名 URL 的秘密访问密钥是否处于不正确无效已关闭状态。当您在秘密访问密钥中添加了不匹配的字符或不正确的空格时,秘密访问密钥会进入以上一种状态。检查您是否使用了正确的访问密钥来重新生成预签名 URL。

验证 URL 中的存储桶名称和密钥名称

验证存储桶名称和对象名称是否正确,以及是否与生成的 URL 签名中的名称相匹配。名称的大小写也必须匹配。

验证 HTTP 请求中使用的标头

确保用于生成签名的 HTTP 标头与客户端在 HTTP 请求中发送到 S3 的标头相匹配。

此外,请确保标头的值与签名计算期间生成的值相匹配。

确认 AWS 区域是否正确

在将预签名 URL 发送到 S3 之前,请确认生成 URL 的 AWS 区域是否与存储桶当前存在的区域相匹配。

运行 GetBucketLocation API 请求,以检查 S3 存储桶所在的区域。您也可以运行 AWS CLI 命令 get-bucket-location

$ aws s3api get-bucket-location --bucket example-bucket

输出示例:

{      
"LocationConstraint": "us-west-2"  
}

检查系统时间的有效期

如果将系统时间设置为数字签名有效期之后的未来日期,则签名将显示为已过期且会失败。如果将系统时间设置为签名有效期之前的过去日期,则签名将无效且会失败。

相关信息

错误代码列表

为什么我的 Amazon S3 存储桶的预签名 URL 会在我指定的到期时间之前过期?

使用预签名 URL 下载和上传对象

如何解决我在尝试访问 S3 对象时收到的“Request has expired”(请求已过期)错误?

AWS 官方
AWS 官方已更新 4 个月前