J'essaie un petit exemple avec AWS API Gateway et autorisation IAM. AWS API Gateway a généré le point de terminaison ci-dessous:
https://xyz1234.execute-api.us-east-2.amazonaws.com/Users/users
avec l'action POST et aucun paramètre.
Au départ, j'avais désactivé l'IAM pour cette méthode POST et j'ai vérifié les résultats à l'aide de Postman, cela fonctionnait. Ensuite, j'ai créé un nouvel utilisateur IAM et attaché la stratégie AmazonAPIGatewayInvokeFullAccess à l'utilisateur, autorisant ainsi l'appel de toutes les API. Activation de l'IAM pour la méthode POST.
Je suis ensuite allé à Postman - et j'ai ajouté une autorisation avec AccessKey, une clé secrète, une région AWS en tant que us-east-2
et un nom de service en tant que execute-api
et j'ai essayé d'exécuter la demande, mais j'ai obtenu une erreur InvalidSignatureException avec le code retour 403.
Le corps contient le message suivant:
Signature expired: 20170517T062414Z is now earlier than 20170517T062840Z (20170517T063340Z - 5 min.)"
Qu'est-ce que je rate ?
Une demande signée avec AWS sigV4 inclut un horodatage indiquant le moment où la signature a été créée. Les signatures ne sont valides que pendant une courte période après leur création. (Cela limite le temps qu'une attaque par rejeu peut être tentée.)
Lorsque la signature est validée, l'horodatage est comparé à l'heure actuelle. Si cela indique que la signature n'a pas été créée récemment, la validation de la signature échoue avec le message d'erreur que vous avez mentionné.
Une cause commune à cela est lorsque l'horloge locale sur l'hôte qui génère la signature est éteinte de plus de quelques minutes.
Vous devez synchroniser l'horloge locale de vos machines avec NTP.
pour par exemple. sur une machine Ubuntu:
Sudo ntpdate pool.ntp.org
L'heure système est souvent mal synchronisée. Vous devez les synchroniser périodiquement.
Vous pouvez exécuter un travail CRON quotidien pour synchroniser l’heure de votre système, comme indiqué sur ce lien: Synchroniser périodiquement l’heure sous Linux
Créez un script bash à synchroniser le temps appelé ntpdate et mettez-le ci-dessous dans ça
#!/bin/sh
# sync server time
/usr/sbin/ntpdate pool.ntp.org >> /tmp/ntpdate.log
Vous pouvez placer ce script où bon vous semble, puis configurer un cron I le mettra dans le répertoire quotidien cron pour qu'il ne soit exécuté qu'une fois Chaque jour, mon script ntpdate est maintenant dans /etc/cron.daily/ntpdate et ça va courir tous les jours
Rendre ce script exécutable
chmod +x /etc/cron.daily/ntpdate
Testez-le en exécutant le script une fois et recherchez une sortie dans /tmp/ntpdate.log
/etc/cron.daily/ntpdate
Dans votre fichier journal, vous devriez voir quelque chose comme:
26 Aug 12:19:06 ntpdate[2191]: adjust time server 206.108.0.131 offset 0.272120 sec
Je faisais également face à ce problème, a ajouté
correctClockSkew: true
et problème résolu pour moi
const nodemailer = require('nodemailer');
const ses = require('nodemailer-ses-transport');
let transporter = nodemailer.createTransport(ses({
correctClockSkew: true,
accessKeyId: **,
secretAccessKey: **,
region: **
}));