Подпись expired: теперь раньше ошибки: InvalidSignatureException

Я пробую небольшой пример с AWS API Gateway и авторизацией IAM. Шлюз AWS API создал следующую конечную точку:

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

с POST-действием и без параметров.

Первоначально я отключил IAM для этого метода POST, и я проверил результаты, используя Postman, он работает. Затем я создал нового пользователя IAM и присоединил к нему политику AmazonAPIGatewayInvokeFullAccess, тем самым давая разрешение на вызов любых API. Включен IAM для метода POST.

Затем я отправился в Postman - и добавил авторизацию с AccessKey, Secret Key, AWS Region как us-east-2 и имя службы как execute-api и попытался выполнить запрос, но я получил ошибку InvalidSignatureException с 403 как код возврата.

Тело содержит следующее сообщение:

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

Что мне не хватает?

Ответ 1

Запрос, подписанный с AWS sigV4, включает отметку времени, когда была создана подпись. Подписи действительны только в течение короткого периода времени после их создания. (Это ограничивает время, в течение которого может быть предпринята попытка повторной атаки.)

Когда подпись проверена, метка времени сравнивается с текущим временем. Если это указывает на то, что подпись не была создана в последнее время, проверка подписи с ошибкой появляется с сообщением об ошибке.

Общей причиной этого является то, что локальные часы на хосте, генерирующие подпись, отключены более чем на пару минут.

Ответ 2

Вам нужно синхронизировать локальные часы ваших машин с NTP.

например. на машине ubuntu:

sudo ntpdate pool.ntp.org

Системное время часто выходит из строя. Вы должны периодически синхронизировать их.

Вы можете запустить ежедневное задание CRON, чтобы синхронизировать ваше системное время, как указано в этой ссылке: Периодически синхронизировать время в Linux

Создайте bash script для синхронизации времени, называемого ntpdate, и поместите ниже в него

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

Вы можете разместить этот script где угодно, а затем настроить cron я будет помещать его в ежедневный каталог cron, чтобы он запускался один раз каждый день Итак, мой ntpdate script теперь находится в /etc/cron.daily/ntpdate и он будет работать каждый день

Сделайте этот script исполняемый

chmod +x /etc/cron.daily/ntpdate

Протестируйте его, запустив script один раз и ищите некоторый вывод в /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

Ответ 3

Столкнулся с подобной проблемой, когда я использую команду timedatectl для изменения даты и времени базовой машины... Объяснение, данное MikeD и другими, действительно информативно, чтобы решить проблему....

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

После синхронизации времени с правильной текущей датой-временем эта проблема будет решена

Ответ 4

Я тоже столкнулся с этой проблемой, добавил

correctClockSkew: true

и проблема исправлена для меня

const nodemailer = require('nodemailer');
const ses = require('nodemailer-ses-transport');



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

Ответ 5

Я столкнулся с этой же проблемой при загрузке видео с Amazon Kinesis на мой локальный веб-сайт. Итак, чтобы решить эту проблему, я установил crony на свой компьютер. Этот crony решил мою проблему. Вы можете увидеть установку Amazon crony по следующей ссылке.https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html

Ответ 6

Эта команда сделала свое дело

sudo ntpdate pool.ntp.org