本文介绍事件总线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发送的,事件目标不接受该事件。
-
-
事件目标生成待签字符串。
更多待签字符串生成规范,请参见待签名字符串生成规范。
-
事件目标使用步骤2中提取的公钥,对待签字符串进行哈希运算并使用RSA签名验证,验证header x-eventbridge-signature-v2中的签名。
-
如果验证通过,表示该请求是从事件总线EventBridge发送的,事件目标接收并处理该事件。
-
如果验证失败,表示该请求不是从事件总线EventBridge发送的,事件目标不接受该事件。
-
待签名字符串生成规范
StringToSign = URL + "\n" + 官方固定header + "\n" + body
其中:
-
URL:完整的目标地址,包含schema、域名、path和queryParam。例如:
https://example.com/api/v1/events?key1=value1 -
官方固定header:服务端发送的请求消息的RequestHeader里携带的官方固定header参数,参数之间使用
\n进行连接。 -
body:请求体原始内容,使用UTF-8编码。
官方固定header参数按照以下先后顺序排列:
-
x-eventbridge-signature-timestamp:请求发送的时间戳。当发送时间和接收时间的间隔超过60s,该时间戳被认为失效,生成签名失败以防止重放攻击。
-
x-eventbridge-hash-method:哈希算法。当前版本固定为SHA256。事件目标验证签名时,应使用此字段指定的哈希算法对待签字符串进行哈希运算,然后使用RSA签名验证。
-
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:待签名字符串构建