本文介绍事件总线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获取公钥。
  3. 事件目标用公钥对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

官方固定header参数解释如下:

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