Amazon Simple Notification Service
開発者ガイド (API バージョン 2010-03-31)

Amazon SNS メッセージの署名の確認

Amazon SNS によって送信された通知、受信登録の確認、または受信登録解除の確認メッセージの信頼性を確認する必要があります。エンドポイントは、Amazon SNS メッセージに含まれる情報を使用して、署名する文字列と署名を再作成し、メッセージの内容から再作成した署名を、Amazon SNS がメッセージとともに送信した署名を照合してメッセージの内容を確認できるようにします。

なりすまし攻撃を防ぐには、Amazon SNS によって送信されたメッセージを検証するときに、以下の操作を行う必要があります。

  • Amazon SNS から証明書を取得するときは必ず HTTPS を使用する。

  • 証明書の信頼性を検証する。

  • 証明書が Amazon SNS から受信されたことを確認する。

  • 可能であれば、サポートされている Amazon SNS 用 AWS SDK のいずれかを使用してメッセージを検証および確認する。たとえば AWS SDK for PHP では、MessageValidator クラスの isValid メソッドを使用します。

Amazon SNS メッセージを処理する Java サーブレットのコード例については、「Amazon SNS エンドポイント Java Servlet のコード例」を参照してください。

HTTP クエリベースのリクエストの使用時に Amazon SNS メッセージの署名を確認するには

  1. Amazon SNS がエンドポイントに送信した HTTP POST リクエストの本文で、JSON ドキュメント名前から名前と値のペアを抽出します。署名する文字列を作成するために、名前と値のペアの一部の値を使用します。Amazon SNS メッセージの署名を確認する場合は、Message および Subject の値で、エスケープした制御文字を元の文字表現に変換し直すことが重要です。これらの値では、署名する文字列の一部として使用するときに、元の形式になっている必要があります。JSON ドキュメントを解析する方法の詳細については、「エンドポイントでメッセージを処理する準備が完了していることを確認する」を参照してください。

    SignatureVersion により、署名バージョンがわかります。署名バージョンからは、署名を生成する方法の要件を判断できます。Amazon SNS 通知については、Amazon SNS は現在、署名バージョン 1 をサポートしています。このセクションでは、署名バージョン 1 を使用して署名を作成する手順を説明します。

  2. メッセージの署名に Amazon SNS が使用した X509 証明書を取得します。SigningCertURL 値は、メッセージのデジタル署名の作成に使用された X509 証明書の場所を指します。この場所から証明書を取得します。

  3. 証明書からパブリックキーを抽出します。SigningCertURL で指定された証明書からのパブリックキーを使用して、メッセージの信頼性と整合性を確認します。

  4. メッセージタイプを判断します。署名する文字列の形式は Type 値によって指定されるメッセージタイプによって異なります。

  5. 署名する文字列を作成します。署名対象の文字列は、改行文字で区切られた、メッセージからの特定の名前と値のペアのリストです。–それぞれの名前と値のペアは、名前で始まり、改行文字、値の順に続き、改行文字で終わります。名前と値のペアは、バイト順でソートしてリストされる必要があります。

    署名する文字列には、メッセージタイプに応じて以下の名前と値のペアが必要です。

    通知

    通知メッセージには、以下の名前と値のペアを含める必要があります。

    Message MessageId Subject (if included in the message) Timestamp TopicArn Type

    以下の例は Notification に関して署名する文字列です。

    Message My Test Message MessageId 4d4dc071-ddbf-465d-bba8-08f81c89da64 Subject My subject Timestamp 2012-06-05T04:37:04.321Z TopicArn arn:aws:sns:us-east-1:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P Type Notification
    SubscriptionConfirmation および UnsubscribeConfirmation

    SubscriptionConfirmation および UnsubscribeConfirmation メッセージには、以下の名前と値のペアを含める必要があります。

    Message MessageId SubscribeURL Timestamp Token TopicArn Type

    以下の例は SubscriptionConfirmation に関して署名する文字列です。

    Message My Test Message MessageId 3d891288-136d-417f-bc05-901c108273ee SubscribeURL https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P&Token=2336412f37fb687f5d51e6e241d09c8058323f60b964268bfe08ce35640228c208a66d3621bd9f7b012918cfdcfe65e153df551f76df58ed147f1245e330ce77ceff06dedab9f051f7028657e6c42750bf64bc9ef711d494e9f7637b86e690779eb5568f72466806b246bd244fa9392b1bc01eeb1c5e420847a745b7aa4b0085 Timestamp 2012-06-03T19:25:13.719Z Token 2336412f37fb687f5d51e6e241d09c8058323f60b964268bfe08ce35640228c208a66d3621bd9f7b012918cfdcfe65e153df551f76df58ed147f1245e330ce77ceff06dedab9f051f7028657e6c42750bf64bc9ef711d494e9f7637b86e690779eb5568f72466806b246bd244fa9392b1bc01eeb1c5e420847a745b7aa4b0085 TopicArn arn:aws:sns:us-west-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P Type SubscriptionConfirmation
  6. Base64 形式から Signature の値をデコードします。メッセージは、Base64 としてエンコードされた Signature 値で署名を配信します。署名の値を、計算した署名と比較する前に、Base64 から Signature の値をデコードし、同じ形式を使って値を比較します。

  7. Amazon SNS メッセージの派生したハッシュ値を生成します。署名の生成に使用されるのと同じハッシュ関数に、正規形式で Amazon SNS メッセージを送信します。

  8. Amazon SNS メッセージのアサートされたハッシュ値を生成します。アサートされたハッシュ値は、Amazon SNS メッセージで配信された署名を復号するために (ステップ 3 の) パブリックキー値を使用した結果です。

  9. Amazon SNS メッセージの信頼性と整合性を確認します。(ステップ 7 からの) 派生したハッシュ値を、(ステップ 8 からの) アサートされたハッシュ値に比較します。値が同じ場合、受信者はメッセージが転送中に変更されておらず、メッセージが Amazon SNS から発信されたことを確認できます。値が同じでない場合、受信者はこれを信頼することはできません。