本文介绍事件总线EventBridge向HTTP/HTTPS类型的事件目标推送事件时采用的签名算法。
背景信息
在事件总线EventBridge的基本模型中,事件从事件源被投递到事件总线,经过规则的过滤和转换处理,最终被投递给多种事件目标,完成事件的处理。所以,HTTP/HTTPS类型的事件目标通常需要暴露公网Endpoint以接收事件总线EventBridge推送的事件内容。为了保证数据安全,HTTP/HTTPS类型的事件目标需要识别接受的请求是否是事件总线EventBridge发送的请求。
事件总线EventBridge生成签名
事件总线EventBridge生成待签字符串。
更多待签字符串生成规范,请参见待签名字符串生成规范。
事件总线EventBridge使用SHA256算法对待签字符串生成散列值,并将哈希算法写入header:x-eventbridge-hash-method。
事件总线EventBridge使用私钥对散列值进行RSA签名并使用Base64进行编码,然后将该值写入header:x-eventbridge-signature-v2。
事件总线EventBridge将当前时间戳写入header:x-eventbridge-signature-timestamp。
事件总线EventBridge将公钥证书地址写入header:x-eventbridge-signature-url。
事件目标校验签名
事件目标根据x-eventbridge-signature-timestamp获取服务端发送请求的时间戳。
如果当前时间距时间戳时间超过60s,事件目标认为该请求已经失效,防止重放攻击。
如果当前时间距时间戳时间未超过60s,继续进行以下校验。
事件目标判断x-eventbridge-signature-url是否为事件总线EventBridge官方合法证书来源,即域名格式是否为
https://[RegionId]-eventbridge.oss-accelerate.aliyuncs.com。如果是官方合法证书来源,事件目标根据x-eventbridge-signature-url指定的地址从事件总线EventBridge获取公钥。
如果不是官方合法证书来源,事件目标认为该请求不是从事件总线EventBridge发送的,事件目标不接受该事件。
事件目标生成待签字符串。
更多待签字符串生成规范,请参见待签名字符串生成规范。
事件目标使用公钥对待签字符串进行哈希运算和RSA签名验证x-eventbridge-signature-v2。
如果验证通过,表示该请求是从事件总线EventBridge发送的,事件目标接收并处理该事件。
如果验证失败,表示该请求不是从事件总线EventBridge发送的,事件目标不接受该事件。
待签名字符串生成规范
StringToSign = URL + "\n" + 官方固定header + "\n" + body其中URL为完整目标地址(含schema、域名、path、queryParam)。
服务端发送的请求消息的RequestHeader里携带了官方固定header参数,对官方固定header参数的解释如下:
x-eventbridge-signature-timestamp:请求发送的时间戳。当发送时间和接收时间的间隔超过60s,该时间戳被认为失效,生成签名失败以防止重放攻击。
x-eventbridge-hash-method:哈希算法。默认为SHA256算法。
x-eventbridge-signature-version:签名版本。默认为1.0。
x-eventbridge-signature-url:签名证书地址。
x-eventbridge-signature-token:用户自定义签名Token。该参数可以选填,如果您填写了该参数,需要在客户端生成签名时传入该token。使用说明,请参见路由到HTTP端点地址。
官方固定header参数严格按照上述的先后顺序进行传递,且参数之间使用”\n”进行连接。例如:
"x-eventbridge-signature-timestamp: 1777258182789" + "\n" +
"x-eventbridge-hash-method: SHA256" + "\n" +
"x-eventbridge-signature-version: 1.0" + "\n" +
"x-eventbridge-signature-url: https://cn-hangzhou-eventbridge.oss-accelerate.aliyuncs.com/x509_public_certificate_2021012501.pem"参考实现
EventBridge提供Java开源参考实现,帮助您理解签名验证流程。
SignatureVerify.java:签名验证主逻辑
PublicKeyBuilder.java:公钥证书下载和解析
StringToSignBuilder.java:待签名字符串构建