Amazon Simple Notification Service
开发人员指南 (API Version 2010-03-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

验证 Amazon SNS 消息签名

您应对 Amazon SNS 发送的通知、订阅确认或取消订阅确认消息进行验证。使用 Amazon SNS 消息中所含的信息,您的终端节点可以重新创建待签字符串和签名,以便您将基于消息内容重新创建的签名与 Amazon SNS 消息随附的签名进行匹配,从而对消息内容进行验证。

为帮助防止欺诈攻击,您在验证 Amazon SNS 发送的消息时应执行以下操作:

  • 从 Amazon SNS 获取证书时始终使用 HTTPS。

  • 验证证书的真伪。

  • 验证证书是否是从 Amazon SNS 收到的。

  • 尽可能使用支持的适用于 Amazon SNS 的 AWS 软件开发工具包来验证消息。例如,使用 适用于 PHP 的 AWS 开发工具包时,您可以使用 MessageValidator 类的 isValid 方法。

有关处理 Amazon SNS 消息的 Java servlet 示例代码 ,请参阅 Amazon SNS 终端节点 Java Servlet 代码示例

在使用基于 HTTP 查询的请求时验证 Amazon SNS 消息的签名

  1. 从 Amazon SNS 向终端节点发送的 HTTP POST 请求正文的 JSON 文档中提取名称/值对。您可以使用名称/值对中的一些值创建待签字符串。当您正在验证 Amazon SNS 消息签名时,应将转义控制字符转换成其在 MessageSubject 值中的原始字符,这点很重要。当您将上述值用作待签字符串一部分时,上述值必须保留原始形式。有关如何分析 JSON 文档的信息,请参阅 步骤 1:确保您的终端节点已准备好处理 Amazon SNS 消息

    SignatureVersion 将显示签名版本。通过签名版本,您可以确定生成签名的要求。对于 Amazon SNS 通知,Amazon SNS 当前支持签名版本 1。 本部分提供使用签名版本 1 来创建签名的各个步骤。

  2. 获取 Amazon SNS 用于签署消息的 X509 证书。指向 X509 证书位置的 SigningCertURL 值用于创建消息的数字签名。检索此位置上的证书。

  3. 从此证书上提取公钥。来自 SigningCertURL 所指定证书的公钥用于验证信息的真实性和完整性。

  4. 确定消息类型。待签字符串格式取决于消息类型,该类型由 Type 值指定。

  5. 创建待签字符串。待签字符串为来自消息的特定名称/值对换行符逗号分隔列表。各个名称/值对由值后面换行符之后的第一个名称表示,以换行符为结尾。名称/值对必须以字节排序顺序予以列明。

    根据消息类型,待签字符串必须具备以下名称/值对。

    通知

    通知消息必须含有如下名称/值对:

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

    以下为针对 Notification 待签字符串的一个示例。

    Copy
    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

    SubscriptionConfirmationUnsubscribeConfirmation 消息必须包含如下名称/值对:

    Copy
    Message MessageId SubscribeURL Timestamp Token TopicArn Type

    以下为针对 SubscriptionConfirmation 待签字符串的一个示例。

    Copy
    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 值。消息传递以 Signature 值表示的签名,并将该签名编码为 Base64。将签名值与您计算出的签名进行对比前,应确保您已通过 Base64 完成对 Signature 值的解码操作,然后才能将运用相同格式的值进行对比。

  7. 生成 Amazon SNS 消息的派生哈希值。以规范格式将 Amazon SNS 消息提交给用于生成签名的相同哈希函数。

  8. 生成 Amazon SNS 消息的断言哈希值。断言的哈希值为使用公有密钥值(来自步骤 3)对随 Amazon SNS 消息发布的签名进行解码得到的结果。

  9. 验证 Amazon SNS 信息的真实性和完整性。比较派生的哈希值(来自步骤 7)与断言的哈希值(来自步骤 8)。如果值相同,则接收人可确定消息在传输过程中未被修改,并且消息一定是源自 Amazon SNS。如果值不相同,则接收人不应信任它。