Amazon SNS メッセージの署名の確認 - Amazon Simple Notification Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Notification

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

    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 2019-01-31T04:37:04.321Z TopicArn arn:aws:sns:us-east-2: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-east-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P&Token=233... Timestamp 2019-01-31T19:25:13.719Z Token 233... TopicArn arn:aws:sns:us-east-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 から発信されたことを確認できます。値が同じでない場合、受信者はこれを信頼することはできません。