本文介绍事件总线EventBridge向HTTP/HTTPS类型的事件目标推送事件时采用的签名算法。

背景信息

事件总线EventBridge的基本模型中,事件从事件源被投递到事件总线,经过规则的过滤和转换处理,最终被投递给多种事件目标,完成事件的处理。所以,HTTP/HTTPS类型的事件目标通常需要暴露公网Endpoint以接收事件总线EventBridge推送的事件内容。为了保证数据安全,HTTP/HTTPS类型的事件目标需要识别接受的请求是否是事件总线EventBridge发送的请求。

事件总线EventBridge生成签名

  1. 事件总线EventBridge生成一个临时secret。
  2. 事件总线EventBridge使用私钥对临时secret加密,并放在header:x-eventbridge-signature-secret。
  3. 事件总线EventBridge生成待签字符串。
    更多待签字符串生成规范,请参见待签名字符串生成规范
  4. 事件总线EventBridge默认使用HMAC-SHA1算法通过临时secret对待签数据进行加密生成加密值,并将签名算法写入header:x-eventbridge-signature-method。
  5. 事件总线EventBridge将当前时间戳写入header:x-eventbridge-signature-timestamp。
  6. 事件总线EventBridge将待签数据加密生成的HMAC-SHA1加密值使用Base64进行编码,然后将该值写入header:x-eventbridge-signature。
    公式如下所示:
    Signature = Base64( HMAC-SHA1( 临时secret, UTF-8-Encoding-Of(
    StringToSign)) )

事件目标校验签名

  1. 事件目标根据x-eventbridge-signature-timestamp获取服务端发送请求的时间戳。
    • 如果当前时间距时间戳时间超过60s,事件目标认为该请求已经失效,防止重放攻击。
    • 如果当前时间距时间戳时间未超过60s,继续进行以下校验。
  2. 事件目标判断x-eventbridge-signature-url是否为事件总线EventBridge官方合法证书来源,即域名格式是否为https://[RegionId]-eventbridge.oss-accelerate.aliyuncs.com
    • 如果是官方合法证书来源,事件目标根据x-eventbridge-signature-url指定的地址从事件总线EventBridge获取公钥。
    • 如果不是官方合法证书来源,事件目标认为该请求不是从事件总线EventBridge发送的,事件目标不接受该事件。
  3. 事件目标使用2中获取的公钥对x-eventbridge-signature-secret进行解密,获取临时secret。
  4. 事件目标生成待签字符串。
    更多待签字符串生成规范,请参见待签名字符串生成规范
  5. 事件目标根据x-eventbridge-signature-method默认使用HMAC-SHA1算法通过临时指定的签名算法进行加密生成加密值。
  6. 事件目标将待签数据生成的HMAC-SHA1加密值使用Base64进行编码生成signature。
  7. 事件目标将事件总线EventBridge生成签名中生成的header:x-eventbridge-signature与6中生成的signature进行比较。
    • 如果两个签名相同,表示该请求是从事件总线EventBridge发送的,事件目标接收并处理该事件。
    • 如果两个签名不同,表示该请求不是从事件总线EventBridge发送的,事件目标不接受该事件。

待签名字符串生成规范

StringToSign = schema+"://"+目标地址+"path"+"?"+"queryParam" + "\n" + 官方固定header + "\n"  + body

服务端发送的请求消息的RequestHeader里携带了官方固定header参数,对官方固定header参数的解释如下:

  • x-eventbridge-signature-timestamp:请求发送的时间戳。当发送时间和接收时间的间隔超过60s,该时间戳被认为失效,生成签名失败以防止重放攻击。
  • x-eventbridge-signature-method:签名算法。默认为HMAC-SHA1算法。
  • x-eventbridge-signature-version:签名版本。默认为1.0。
  • x-eventbridge-signature-url:签名证书地址。
注意 官方固定header参数严格按照上述的先后顺序进行传递,且参数之间使用“\n”进行连接。例如:"x-eventbridge-signature-timestamp: <your timestamp>" + "\n" +"x-eventbridge-signature-method: HMAC-SHA1"+ "\n" +"x-eventbridge-signature-version: 1.0" + "\n" +"x-eventbridge-signature-url: <your url>"