联邦
联邦允许主服务器之间相互通信,实现跨服务器的房间参与。
联邦端点
所有端点位于 /_matrix/federation/v1/ 下(邀请 v2 除外)。
请求签名
每个联邦请求都使用服务器的 ed25519 签名密钥进行签名。
签名流程
- 构建请求体的规范 JSON
- 计算 SHA-256 哈希 → base64url(无填充)
- 构建签名字符串:
origin destination method uri ts content_hash - 使用服务器私钥签名
- 附加
Authorization: X-Matrix origin=...,destination=...,key=...,sig=...,ts=...
验证
FederationRequestSigningService.verifyRequestSignature() 检查:
- Authorization 头格式(
X-Matrix ...) - Origin/destination 匹配
- 时钟偏差(5 分钟内)
- 内容哈希完整性
Note
针对远程服务器公钥的加密签名验证目前为全接受模式。完整验证需要从 /_matrix/key/v2/server 获取远程签名密钥。
密钥缓存
FederationKeyCache 缓存远程服务器签名密钥:
- TTL:密钥缓存可配置的时长
- 负缓存:失败的密钥查找短暂缓存,避免频繁请求
- 公证:通过
/_matrix/key/v2/query向其他服务器查询目标服务器的密钥
目标队列
FederationDestinationQueue 管理出站事务:
- 指数退避:失败的投递以递增延迟重试
- 死亡检测:在重复失败后将目标标记为不可达
- 事务 ID:每个目标单调递增
EDU 处理
临时数据单元(EDU)在服务器之间传递实时状态:
服务器发现
SigningKeyService 管理本地服务器的 ed25519 密钥对,支持自动轮换(7 天周期)。