【问题标题】:Signature expired: is now earlier than error : InvalidSignatureException签名过期:现在早于错误:InvalidSignatureException
【发布时间】:2025-11-24 01:20:13
【问题描述】:

我正在尝试使用 AWS API Gateway 和 IAM 授权的小示例。 AWS API Gateway 生成了以下端点:

https://xyz1234.execute-api.us-east-2.amazonaws.com/Users/users

带有 POST 操作且无参数。

最初,我为此 POST 方法关闭了 IAM,并使用 Postman 验证了结果,它可以工作。 然后我创建了一个新的 IAM 用户并将 AmazonAPIGatewayInvokeFullAccess 策略附加到该用户,从而授予调用任何 API 的权限。为 POST 方法启用 IAM。

然后我去了 Postman - 并添加了 AccessKey、Secret Key、AWS 区域作为us-east-2 和服务名称作为execute-api 的授权,并尝试执行请求,但我收到 InvalidSignatureException 错误,返回码为 403。

正文包含以下消息:

Signature expired: 20170517T062414Z is now earlier than 20170517T062840Z (20170517T063340Z - 5 min.)" 

我错过了什么?

【问题讨论】:

  • 您是否在生成签名的机器上正确设置了时钟和时区?
  • 谢谢@Michael-sqlbot - 错误地在机器上手动设置了时间并且没有设置为标准时间。
  • 与你的机器时间有关,我在使用 docker 时遇到了这个问题。 docker容器中的时间过去了,我不得不重新启动docker服务

标签: amazon-web-services postman aws-api-gateway amazon-iam


【解决方案1】:

使用 AWS sigV4 签名的请求包含创建签名时的时间戳。签名仅在创建后的短时间内有效。 (这限制了可以尝试重放攻击的时间。)

验证签名后,会将时间戳与当前时间进行比较。如果这表明签名不是最近创建的,则签名验证失败并显示您提到的错误消息。

如果您在 Windows 上使用 WSL 的 Docker 容器中启用此功能,则通过在 Powershell 中运行 wsl -d docker-desktop -e /sbin/hwclock -s 可能有助于修复 WSL 时间。您可以通过登录到容器和 在终端中输入date 并将其与您的主机时间进行比较。

造成这种情况的常见原因是生成签名的主机上的本地时钟关闭超过几分钟。

【讨论】:

    【解决方案2】:

    您需要将您的机器本地时钟与 NTP 同步。

    例如。在 ubuntu 机器上:

    sudo ntpdate pool.ntp.org
    

    系统时间经常不同步。您需要定期使它们保持同步。

    您可以运行每日 CRON 作业以保持系统时间同步,如以下链接所述:Periodically synchronize time in Linux

    创建一个名为 ntpdate 的 bash 脚本来同步时间,并在下面放置 进去

    #!/bin/sh
    # sync server time
    /usr/sbin/ntpdate pool.ntp.org >> /tmp/ntpdate.log
    

    您可以将此脚本放置在您喜欢的任何位置,然后设置一个 cron I 将把它放到每天的 cron 目录中,以便它运行一次 每天所以我的 ntpdate 脚本现在在 /etc/cron.daily/ntpdate 和 它会每天运行

    使该脚本可执行

    chmod +x /etc/cron.daily/ntpdate
    

    通过运行脚本一次来测试它并在 /tmp/ntpdate.log

    /etc/cron.daily/ntpdate
    

    在您的日志文件中,您应该会看到类似

    26 Aug 12:19:06 ntpdate[2191]: adjust time server 206.108.0.131 offset 0.272120 sec
    

    【讨论】:

    • 感谢分享@Yeshodhan。一个猜测 - 我已将 MacBook 的时间设置为自动设置日期和时间 - 我相信这会处理同步?
    • 如果您在虚拟机上,尤其是使用 Vagrant 并且经常使用挂起命令时,很可能会发生这种情况。只是个人经验的说明。
    【解决方案3】:

    当我使用 timedatectl 命令更改底层机器的日期时间时遇到了类似的问题...... MikeD 和其他人给出的解释对于解决这个问题非常有用......

    sudo apt install ntp
    sudo apt install ntpdate
    sudo ntpdate ntp.ubuntu.com
    

    将时间与正确的当前日期时间同步后,此问题将得到解决

    【讨论】:

    • 这个工具是否在 ubuntu 20 中被直接删除了?
    【解决方案4】:

    这个命令成功了

    sudo ntpdate pool.ntp.org
    

    【讨论】:

      【解决方案5】:

      对我来说,问题是在使用 WSL 时发生的。 WSL 中的日期不同步。 解决方案是运行命令 wsl --shutdown 并重启 docker。

      【讨论】:

      • 成功了!为了澄清这样做的其他人,请在 Powershell 中运行wsl --shutdown,一旦它完成关闭,Docker 将弹出一条通知,说它需要重新启动。在此过程中,WSL 会以某种方式自动重启。
      • 拯救了我的一天!谢谢
      【解决方案6】:

      确保您的 PC 时钟设置正确。我遇到了同样的问题,然后意识到由于某种原因我的时钟没有显示正确的时间。一旦我更正了时间,它又开始正常工作了!希望这会有所帮助。

      【讨论】:

      • 谢谢(欢迎堆栈溢出!)。在我的情况下,我使用的 VM (WSL2) 与主机不同步,手动或仅通过重新启动它来修复 VM 9 上的时间)解决了错误。
      【解决方案7】:

      如果您在 AWS Ec2 Ubuntu 服务器中并且不知何故无法使用 NTP 修复时间。

      sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
      

      来源:https://askubuntu.com/a/655528

      【讨论】:

        【解决方案8】:

        我也遇到过这个问题,补充

        correctClockSkew: true

        并为我解决了问题

        const nodemailer = require('nodemailer');
        const ses = require('nodemailer-ses-transport');
        
        
        
        let transporter = nodemailer.createTransport(ses({
                correctClockSkew: true,
                accessKeyId: **,
                secretAccessKey: **,
                region: **
            }));
        

        【讨论】:

          【解决方案9】:

          对于那些在使用 sam local invoke 在本地运行 Lambda 函数(使用 DynamoDB 等其他 AWS 服务)时遇到此问题的用户: sam 使用的 docker 容器中的时间可能与主机不同步。在主机上重新启动 docker(Windows 上的 Docker Desktop)应该可以解决这个问题。

          【讨论】:

            【解决方案10】:

            我从本地机器上的虚拟机发出 AWS API 请求。我检查了日期是否正确并且正在同步,但我仍然收到上述错误。我停止并重新启动了我的虚拟机,错误就消失了。我从来没有弄清楚确切的原因,但是“将其关闭并重新打开”修复了它。

            【讨论】:

              【解决方案11】:

              作为 @miked-at-aws 关于 AWS sigV4 的帖子的补充,时钟偏差至少有 2 个主要可能的根本原因:

              1. 您的 CPU 过载(达到 99% 的使用率或在 EC2 实例中 CPU 限制已用完 CPU 积分)。

              为什么会产生时间偏差?因为当 amazon SDK 创建到发送请求时的时间戳时,通常不应该超过几纳秒或几微秒,但如果你的 CPU 不堪重负,它可能需要几秒甚至几分钟要处理的案例,因此对于这个根本原因,您不会遇到 100% 的事件丢失,而只是一些可能不会太大的 x%。

              1. 第二个根本原因是您的机器时钟没有被调整,很可能 100% 的事件都丢失了,您只需要确保正确设置和调整您的机器时钟。李>

              【讨论】:

                【解决方案12】:

                我已经尝试了所有与时间同步相关的解决方案,但没有任何效果。我所做的是,在创建服务客户端时,我将正确的ClockSkew 选项设置为true。这解决了我的问题。

                例如:

                let dynamodb = new AWS.DynamoDB({correctClockSkew: true});

                希望这会解决。

                参考:https://github.com/aws/aws-sdk-js/issues/527

                【讨论】:

                  【解决方案13】:

                  我在从 Amazon Kinesis 获取视频到我的本地网站时遇到了同样的问题。所以,为了解决这个问题,我在我的电脑上安装了裙带裙。这个裙带裙解决了我的问题。你可以在下面的链接中看到亚马逊裙带裙的安装。 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html

                  【讨论】:

                    【解决方案14】:

                    对我有用的是更改计算机上的时间。我在英国,所以我提前一小时换上欧洲时区。然后它起作用了。这不是最好的解决方法,但它对我前进很有帮助。 我将时区设置为伦敦的 eu-west-2,所以我不确定为什么它只有在我将计算机上的时间提前一个小时时才有效。我需要调查一下。

                    【讨论】:

                      最近更新 更多