Подпись 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