Amazon SNS メッセージの署名の検証 - Amazon Simple Notification Service

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

Amazon SNS メッセージの署名の検証

Amazon によってHTTPエンドポイントに送信されたメッセージの信頼性を確認するにはSNS、メッセージ署名を検証します。メッセージの信頼性の検証を推奨するケースは 2 つあります。まず、トピックにサブスクライブしたSNSメッセージを Amazon がHTTPエンドポイントに送信するとき。2 SNSつ目は、 Subscribeまたは UnsubscribeAPIアクションの実行時に Amazon がHTTPエンドポイントに確認メッセージを送信するときです。

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

  • Amazon から証明書を取得するHTTPSときは、常に を使用してくださいSNS。

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

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

  • 可能であれば、Amazon でサポートされている AWS SDKs のいずれかを使用してSNS、メッセージを検証および検証します。

  • Amazon SNS メッセージが目的の から受信されていることを確認しますTopicArn

Amazon SNS は、次の 2 つのメッセージ署名バージョンをサポートしています。

  • SignatureVersion1: Amazon は、メッセージのSHA1ハッシュに基づいて署名SNSを作成します。

  • SignatureVersion2: Amazon は、メッセージのSHA256ハッシュに基づいて署名SNSを作成します。

Amazon SNSトピックでメッセージ署名バージョンを設定するには

デフォルトでは、Amazon SNSトピックは 1 SignatureVersion を使用します。Amazon SNSトピックでハッシュアルゴリズム 1 (SHA1) SignatureVersion または 2 (SHA256) SignatureVersion を選択するには、 SetTopicAttributesAPIアクションを使用できます。

次のコード例は、 AWS CLIを使用してトピック属性 SignatureVersion を設定する方法を示しています。

aws sns set-topic-attributes \ --topic-arn arn:aws:sns:us-east-2:123456789012:MyTopic \ --attribute-name SignatureVersion \ --attribute-value 2
HTTP クエリベースのリクエストを使用するときに Amazon SNS メッセージの署名を検証するには
  1. Amazon がエンドポイントSNSに送信したHTTPPOSTリクエストの本文にあるJSONドキュメントから名前と値のペアを抽出します。署名対象の文字列を作成するために、名前と値のペアの一部の値を使用します。Amazon SNS メッセージの署名を検証するときは、エスケープされた制御文字を Messageおよび Subject値の元の文字表現に変換することが重要です。これらの値では、署名対象の文字列の一部として使用するときに、元の形式になっている必要があります。JSON ドキュメントを解析する方法については、「」を参照してくださいステップ 1: エンドポイントで Amazon SNS メッセージを処理する準備が完了していることを確認する

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

  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 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
    注記

    SubscribeURL フィールドは、 SubscriptionConfirmationおよび UnsubscribeConfirmation メッセージの両方に署名するために文字列で使用されます。これはURL、サブスクリプションを確認または管理するために必要です。

  6. Base64 形式から Signature 値をデコードします。メッセージは、Base64 としてエンコードされた Signature 値で署名を配信します。署名の値を、計算した署名と比較する前に、Base64 から Signature の値をデコードし、同じ形式を使って値を比較します。

  7. Amazon SNSメッセージの派生ハッシュ値を生成します。Amazon SNSメッセージを正規形式で、署名の生成に使用したのと同じハッシュアルゴリズムに送信します。

    1. SignatureVersion1 の場合は、ハッシュアルゴリズムSHA1として を使用します。

    2. SignatureVersion2 の場合は、ハッシュアルゴリズムSHA256として を使用します。

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

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