AWS SNSの通知(Notification)の署名を検証する方法(node.js)

AWS SNSの通知(Notification)の署名を検証する方法(node.js)

SNSの確認や通知はヘッダ情報を偽装してしまってなりすましされてしまう可能性がある為、リクエストから渡ってくる情報で署名検証を行う必要があります。

今回はSNS+エンドポイントがhttpsでAPI Gateway+Lamda(node.js)の構成です。

現状、SNSのエンドポイントのAPI GatewayはPrivate APIをサポートしていませんので、公開APIを使用するしかありません。その為だれでもこのAPIを実行出来てしまう状態なので、署名検証が必要になります。

以下サイトはJavaのサンプルコードがありますが(117pあたり)、node.jsのサンプルコードがなかったのでnode.jsで書いてみました。

https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-dg.pdf

SNSフォーマット(通知)

SNSの通知の場合のフォーマット例です。

通知の場合、署名する文字列は以下のフォーマットになります。

SNSフォーマットで渡ってくるリクエストボディの情報から上記の署名文字列を作成する必要があります。Subjectは省略可能なので、省略されていた場合は署名文字列にSubjectは含みません。あと改行コードが必要となります。

またこの署名文字列が、通知の場合、サブスクリプションの確認削除で異なります。

使用モジュール

pemファイル(公開鍵)の中身を取得するためにsuperagentを使用します。

署名検証するためにcryptoモジュールを使用します。

インストールします。

署名検証ソース(node.js)

SignatureVersionは”1″でなければいけません。このチェックも必要です。

verifyメソッドでデジタル署名の検証を行います。

引数
第一引数 公開鍵
第二引数 署名
第三引数 署名エンコード方式

trueが返ってくれば署名検証OKです。

aws-js-sns-message-validator

https://github.com/aws/aws-js-sns-message-validatorのモジュールを使えば簡単に実装できるようです。

hashのアルゴリズムがJavaとnode.jsで違うようです。

使い方は「AWS SNSからのリクエストを検証するaws-js-sns-message-validatorをPromise化する」を参照ください。

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。

CAPTCHA