
# 校验消息签名
#### 操作场景
为了确保安全，提供订阅确认、取消订阅、通知消息和订阅用户消息的签名认证，在消息的接收方需要对SMN发送的消息进行校验，消息类型包括订阅确认消息、取消订阅通知消息、通知消息、订阅用户确认订阅消息和订阅用户取消订阅消息。使用SMN消息中的信息，您可以通过签名串验证消息的合法性。
#### 操作步骤
验证SMN发送的HTTP(S)请求的流程如下：
1. SMN将根据您终端节点接收的HTTP消息，使用其中关键的键-值信息进行签名验证，具体的验证签名键信息请参考[特定消息类型的签名键值信息]。
2. 通过HTTP消息中的signing_cert_url获取证书内容的地址，通过该地址获取证书内容，并且生成X509证书。
   ![](https://support.huaweicloud.com/usermanual-smn/public_sys-resources/note_3.0-zh-cn.png)
   下载证书的链接始终是HTTPS请求，需要验证下载链接服务器的证书的真伪。
   
3. 从X509证书中提取公钥，用于验证收到消息的可靠性和完整性。
4. 确定消息类型。消息类型为键type对应的值，不同的消息类型对应不同的签名证书验证方式。
5. 创建签名字符串。将消息中的键值对取出来，使其键值按字典序排序。每一个键占一行，每一个值占一行，键所对应的值在该键所占行的下一行。
 
 #### 特定消息类型的签名键值信息
1. 消息通知
   - 消息通知必须包括以下键，如果subject为空，则不参与签名：
     ```
     message
     message_id
     subject
     timestamp
     topic_urn
     type
     ```
     
   
   - 一个消息通知使用的签名键值信息示例如下：
     ```
     message
     My test message
     message_id
     88c726942175432bac921eafd0036163
     subject
     demo
     timestamp
     2016-08-15T07:29:16Z
     topic_urn
     urn:smn:regionId:74dc9e44d0cc4573adfce91cdfdd3ba9:xxxx
     type
     Notification
     ```
     ![](https://support.huaweicloud.com/usermanual-smn/public_sys-resources/note_3.0-zh-cn.png)
     每一个键占一行，每一个值占一行，键所对应的值在该键所占行的下一行。
     
    
2. 订阅确认和取消订阅
   - 订阅确认和取消订阅的消息中必须包含以下键：
     ```
     message
     message_id
     subscribe_url
     timestamp
     topic_urn
     type
     ```
     
   
   
   
   - 一个订阅确认的消息简单示例如下所示：
     ```
     message
     You are invited to subscribe to topic: urn:smn:regionId:d91989905b8449b896f3a4f0ad57222d:demo. To confirm this subscription, please visit the following SubscribeURL in this message.
     message_id
     def5c309cbff44d5a870787ed937edf8
     subscribe_url
     https://ip地址/smn/subscription/confirm?region_id&token&topic_urn:demo
     timestamp
     2016-08-15T07:29:16Z
     topic_urn
     urn:smn:regionId:d91989905b8449b896f3a4f0ad57222d:demo
     type
     SubscriptionConfirmation
     ```
     ![](https://support.huaweicloud.com/usermanual-smn/public_sys-resources/note_3.0-zh-cn.png)
     每一个键占一行，每一个值占一行，键所对应的值在该键所占行的下一行。
     
    
3. 订阅用户确认订阅特定消息类型的签名键值信息
   - 订阅用户确认订阅的消息中必须包含以下键：
     ```
     message
     message_id
     subscribe_url
     timestamp
     type
     ```
     
   
   - 一个订阅用户确认订阅的消息简单示例如下所示：
     ```
     message
     You are invited to be a subscriber that belongs to test_******. To confirm your subscription, click subscribe_url within one year. Keep this URL safe as you will need it for future requests.
     message_id
     1ca9e463f2a84ef69f43b65caf9b2064
     subscribe_url
     https://console.******.com/smn/subscription/confirm?topic_urn=urn:smn:region01:6e******:test_******&token=******
     timestamp
     2026-01-01T00:00:00Z
     type
     HttpSubscriptionUserConfirm
     ```
     ![](https://support.huaweicloud.com/usermanual-smn/public_sys-resources/note_3.0-zh-cn.png)
     每一个键占一行，每一个值占一行，键所对应的值在该键所占行的下一行。
     
    
4. 订阅用户取消订阅
   - 订阅用户取消订阅的消息中必须包含以下键：
     ```
     message 
     message_id 
     timestamp 
     type
     ```
     
   
   - 一个订阅用户取消订阅的消息简单示例如下所示：
     ```
     message
     You have confirmed to be a subscriber. To cancel the confirmation, click unsubscribe_url within one year. Keep this URL safe as you will need it for future requests.
     message_id
     fb28c8e29af542dc80290a8e5b1b8d82
     timestamp
     2026-01-01T00:00:00Z
     type
     HttpSubscriptionUserUnsubscribe
     ```
     ![](https://support.huaweicloud.com/usermanual-smn/public_sys-resources/note_3.0-zh-cn.png)
     每一个键占一行，每一个值占一行，键所对应的值在该键所占行的下一行。
     
    
 
