驗證 Amazon SNS 消息的簽名 - Amazon Simple Notification Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

驗證 Amazon SNS 消息的簽名

要驗證 Amazon 發送到HTTP端點的消息的真實性SNS,您可以驗證消息簽名。在兩種情況下,我們建議您驗證訊息的真實性。首先,當 Amazon SNS 向您的HTTP端點傳送您訂閱某個主題的訊息時。其次,當 Amazon 在執行或UnsubscribeAPI動作時向您SNS傳送確認訊息給您Subscribe的HTTP端點。

驗證 Amazon 傳送的訊息時,您應該執行下列動作SNS:

  • 從 Amazon 獲取證書HTTPS時始終使用SNS。

  • 驗證憑證的真偽。

  • 驗證證書是從 Amazon 收到的SNS。

  • 如果可能,請使用 Amazon 支援 AWS SDKs的其中一個SNS來驗證和驗證訊息。

  • 驗證 Amazon SNS 消息是從您想要的接收TopicArn

Amazon SNS 支持兩種消息簽名版本:

  • SignatureVersion1:Amazon SNS 根據消息的SHA1哈希創建簽名。

  • SignatureVersion2:Amazon SNS 根據消息的SHA256哈希創建簽名。

在 Amazon SNS 主題上配置消息簽名版本

默認情況下,Amazon SNS 主題使用 SignatureVersion 1。若要在 Amazon SNS 主題上選擇雜湊演算法 (SignatureVersion1 (SHA1) 或 SignatureVersion 2 (SHA256),您可以使用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 訊息的簽章時,請務必將逸出控制字元轉換為MessageSubject值中的原始字元表示。這些值在您將其用作要簽署之字串的一部分時必須為其原始形式。如需有關如何剖析JSON文件的資訊,請參閱步驟 1:確保您的端點已就緒可處理 Amazon SNS 訊息

    SignatureVersion告訴您 Amazon SNS 用於生成消息簽名的簽名版本。從簽章版本,您可以判定如何產生簽章的要求。對於通知,Amazon SNS 目前支援簽名版本 12。本節提供使用簽章版本驗證簽章的步驟。

  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

    要驗證SubscriptionConfirmationUnsubscribeConfirmation消息的簽名,要簽署的字符串必須包含以下名稱-值對:

    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段用於字符串中簽名SubscriptionConfirmationUnsubscribeConfirmation消息。這URL是確認或管理訂閱的必要條件。

  6. 從 Base64 格式解碼 Signature 的值。訊息傳遞 Signature 值的簽章,這解碼為 Base64。在比較簽章值和您已計算的簽章之前,確保您從 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。如果值不相同,則接收者不應予以信任。