AWS API GatewayとIAM認証を使用した小さな例を試しています。 AWS API Gatewayは以下のエンドポイントを生成しました:
https://xyz1234.execute-api.us-east-2.amazonaws.com/Users/users
with POST actionおよびパラメーターなし。
最初にこのためにIAMをオフにしましたPOSTメソッドと、Postmanが機能する結果を確認しました。その後、新しいIAMユーザーを作成し、ユーザーにAmazonAPIGatewayInvokeFullAccessポリシーをアタッチして、APIを呼び出す許可を与えましたPOSTメソッドのIAMを有効にしました。
次に、Postmanにアクセスし、AccessKey、Secret Key、AWS Regionをus-east-2
およびサービス名はexecute-api
とリクエストを実行しようとしましたが、戻りコードとして403のInvalidSignatureExceptionエラーが発生しました。
本文には次のメッセージが含まれます。
Signature expired: 20170517T062414Z is now earlier than 20170517T062840Z (20170517T063340Z - 5 min.)"
私は何が欠けていますか?
AWS sigV4で署名されたリクエストには、署名が作成されたときのタイムスタンプが含まれます。署名は、作成されてから短時間のみ有効です。 (これにより、リプレイ攻撃が試行される時間が制限されます。)
署名が検証されると、タイムスタンプが現在の時刻と比較されます。これにより、署名が最近作成されていないことが示された場合、署名の検証は失敗し、指定したエラーメッセージが表示されます。
これの一般的な原因は、署名を生成するホストのローカルクロックが数分以上ずれている場合です。
マシンのローカルクロックをNTPと同期する必要があります。
例えばUbuntuマシンの場合:
Sudo ntpdate pool.ntp.org
システム時刻が頻繁に同期しなくなります。定期的に同期を保つ必要があります。
次のリンクで説明されているように、毎日のCRONジョブを実行してシステム時刻を同期させることができます。 Linuxで定期的に時刻を同期する
Ntpdateと呼ばれる時刻を同期するbashスクリプトを作成し、以下をその中に入れます
#!/bin/sh
# sync server time
/usr/sbin/ntpdate pool.ntp.org >> /tmp/ntpdate.log
このスクリプトを好きな場所に配置し、cronを設定して、毎日1回実行されるように毎日cronディレクトリに配置します。したがって、ntpdateスクリプトは/etc/cron.daily/ntpdateにあり、実行されます。毎日
このスクリプトを実行可能にする
chmod +x /etc/cron.daily/ntpdate
スクリプトを1回実行してテストし、/ 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
私もこの問題に直面していました
correctClockSkew: true
そして私のために修正された問題
const nodemailer = require('nodemailer');
const ses = require('nodemailer-ses-transport');
let transporter = nodemailer.createTransport(ses({
correctClockSkew: true,
accessKeyId: **,
secretAccessKey: **,
region: **
}));
timedatectlコマンドを使用して基礎となるマシンの日時を変更すると、同様の問題に直面しました...
Sudo apt install ntp
Sudo apt install ntpdate
Sudo ntpdate ntp.ubuntu.com
正しい現在の日付時刻と時刻を同期した後、この問題は解決されます
Amazon KinesisからローカルWebサイトにビデオを取得するときに、この同じ問題に直面しています。この問題を解決するために、コンピューターにcronyをインストールしました。このcronyは私の問題を解決しました。次のリンクでAmazon cronyのインストールを確認できます。 https://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/set-time.html