本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
驗證 Amazon SNS 消息的簽名
要驗證 Amazon 發送到HTTP端點的消息的真實性SNS,您可以驗證消息簽名。在兩種情況下,我們建議您驗證訊息的真實性。首先,當 Amazon SNS 向您的HTTP端點傳送您訂閱某個主題的訊息時。其次,當 Amazon 在執行或Unsubscribe
API動作時向您SNS傳送確認訊息給您Subscribe
的HTTP端點。
驗證 Amazon 傳送的訊息時,您應該執行下列動作SNS:
-
從 Amazon 獲取證書HTTPS時始終使用SNS。
-
驗證憑證的真偽。
-
驗證證書是從 Amazon 收到的SNS。
-
如果可能,請使用 Amazon 支援 AWS SDKs的其中一個SNS來驗證和驗證訊息。
-
驗證 Amazon SNS 消息是從您想要的接收
TopicArn
。
Amazon SNS 支持兩種消息簽名版本:
-
SignatureVersion
1:Amazon SNS 根據消息的SHA1哈希創建簽名。 -
SignatureVersion
2:Amazon SNS 根據消息的SHA256哈希創建簽名。
在 Amazon SNS 主題上配置消息簽名版本
默認情況下,Amazon SNS 主題使用 SignatureVersion
1。若要在 Amazon SNS 主題上選擇雜湊演算法 (SignatureVersion
1 (SHA1) 或 SignatureVersion
2 (SHA256),您可以使用SetTopicAttributes
API動作。
下列程式碼範例示範如何使用 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 消息的簽名
-
從 Amazon SNS 發送到端點的HTTPPOST請求正JSON文中的文檔中提取名稱-值對。您將使用一些名稱值組的值來建立要簽署的字串。驗證 Amazon SNS 訊息的簽章時,請務必將逸出控制字元轉換為
Message
和Subject
值中的原始字元表示。這些值在您將其用作要簽署之字串的一部分時必須為其原始形式。如需有關如何剖析JSON文件的資訊,請參閱步驟 1:確保您的端點已就緒可處理 Amazon SNS 訊息。SignatureVersion
告訴您 Amazon SNS 用於生成消息簽名的簽名版本。從簽章版本,您可以判定如何產生簽章的要求。對於通知,Amazon SNS 目前支援簽名版本 1 和 2。本節提供使用簽章版本驗證簽章的步驟。 -
獲取 Amazon SNS 用於簽署消息的 X509 證書。
SigningCertURL
值會指向 X509 憑證的位置,該憑證用於建立訊息的數位簽章。從這個位置讀擷取憑證。 -
從憑證擷取公開金鑰。從
SigningCertURL
所指定憑證的公開金鑰,是用來驗證訊息的真偽和完整性。 -
判定訊息類型。要簽署字串的格式依訊息類型而定,而這由
Type
值指定。 -
建立要簽署的字串。要簽署的字串是訊息的特定名稱值組的新行字元分隔清單。每個名稱值組是以後面先接新行字元、然後是值,再以新行字元結束的名稱表示。名稱值組必須以字元組排序的順序列出。
依照訊息類型而定,要簽署的字串必需具有下列名稱值組。
- 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 Token233...
TopicArn arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P Type SubscriptionConfirmation
注意
該字
SubscribeURL
段用於字符串中簽名SubscriptionConfirmation
和UnsubscribeConfirmation
消息。這URL是確認或管理訂閱的必要條件。 -
從 Base64 格式解碼
Signature
的值。訊息傳遞Signature
值的簽章,這解碼為 Base64。在比較簽章值和您已計算的簽章之前,確保您從 Base64 解碼Signature
值,以便您使用相同格式比較值。 -
生成 Amazon SNS 消息的派生哈希值。以規範格式將 Amazon SNS 訊息提交至用於產生簽章的相同雜湊演算法。
-
如果
SignatureVersion
為 1,請用SHA1作雜湊演算法。 -
如果
SignatureVersion
是 2,請用SHA256作雜湊演算法。
-
-
生成 Amazon SNS 消息的斷言哈希值。宣告的雜湊值是使用公開金鑰值 (從步驟 3 開始) 解密隨 Amazon SNS 訊息傳送的簽章所產生的結果。
-
驗證 Amazon SNS 訊息的真實性和完整性。比較衍生的雜湊值 (從步驟 7) 和插入的雜湊值 (從步驟 8)。如果值相同,則接收者可以確保在傳輸過程中未修改該消息,並且該消息必須源自 Amazon SNS。如果值不相同,則接收者不應予以信任。