The request signature we calculated does not match

TL;DR — AWS 重新计算了你 DynamoDB 请求的 SigV4 签名,得到的值与你发来的不同。常见成因:密钥错误或与访问密钥不配套、你的机器与 AWS 之间存在时钟偏移,或者一个手写的规范请求哪里构造得略有偏差。修好密钥或时钟——又或者干脆让 AWS SDK 替你签名。

含义

InvalidSignatureException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

每个 DynamoDB 请求都用你的密钥、对请求的规范形式做 SigV4 签名。AWS 会在服务端重新推导这个签名;如果不一致,你就得到这个 HTTP 400。这是一次认证失败(身份/签名),与授权被拒绝不同。原样通常不可重试——但如果成因是时钟偏移,它可能表现为时有时无

为什么会发生

  • 密钥错误——AWS_SECRET_ACCESS_KEYAWS_ACCESS_KEY_ID 不对应(密钥搞混了、密钥被轮换过、或者末尾多了一个空格或换行)。
  • 时钟偏移——机器时间与 AWS 有漂移;SigV4 会把请求时间戳揉进签名,所以时钟不对就会把签名破坏掉(在虚拟机/容器里很典型,比如虚拟机从休眠中唤醒之后)。
  • 手工构造的规范请求——某个自定义签名器把头部/查询参数排错了序、URI 编码有误,或者哈希了错误的负载。
  • 密钥中的特殊字符被处理坏了——含有 -+/% 的密钥,可能被那些生成凭证文件的 shell 或脚本弄坏;AWS 建议重新生成密钥。
  • 老旧的 SigV2——用 Signature Version 2 签名,而像 Amazon S3 这样的服务和较新的区域已经不再支持它。
  • 某个代理或网关在签名之后改动了请求(添加/重排头部、对路径重新编码)。

如何修复

  1. 重新核对这对密钥。重新生成或重新复制访问密钥 + 密钥,并干净地设置好(留意末尾的空白/换行;如果密钥里的特殊字符会被你的工具链弄坏,就重新生成一个)。
  2. 修好时钟。启用 NTP,让主机时间准确:
    timedatectl status        # verify "System clock synchronized: yes"
  3. 优先使用 AWS SDK / CLI——让它来构造并签名请求;整整一类规范请求的 bug 就此消失。
  4. 如果你必须手工签名,就严格遵循 SigV4 的规范请求规则(头部排序、URI 编码的路径、x-amz-date、哈希后的负载),并与 CLI 的 --debug 输出比对。
  5. 用一个已知可用的客户端确认身份没问题:
    aws sts get-caller-identity

复现方法

使用真实的访问密钥 ID 进行签名,但密码错误。有关请求的其他所有内容都是有效的,因此失败会隔离签名:

import boto3
boto3.client(
    'dynamodb',
    region_name='us-east-1',
    aws_access_key_id='AKIA...',                      # a real key id
    aws_secret_access_key='deliberately-the-wrong-secret',
).list_tables()

实际输出:

InvalidSignatureException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
HTTP 400

注意该类。 该消息是熟悉的“我们计算的签名不匹配”,但 DynamoDB 将其返回为 InvalidSignatureException — 而不是 SignatureDoesNotMatch,这是其他几个 AWS 服务在相同情况下使用的。如果你按类捕获而不是匹配消息,则这种区别就是触发的处理程序和从不触发的处理程序之间的区别。

在 DynoTable 中查看

DynoTable 从不要求你手动签署请求 - 它使用相同的 AWS SDK 凭证链作为 CLI (Connect an AWS account)。如果 aws sts get-caller-identity成功但DynamoDB仍然抛出此错误,检查应用程序和 AWS 之间的代理或中间件; DynoTable 交谈 DynamoDB 直接从你的机器进行,无需中介。修复按键后或时钟偏差,若修复了密钥或时钟偏差,按 ⌘P 确认活动配置文件,并在再次打开表之前于 设置 → 配置文件 中运行 测试连接

相关错误

来源

根据 us-east-1 中的实时 DynamoDB 服务于 2026 年 7 月 26 日转载 — 上面的输出是逐字记录的。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。