一、定位

SAS(Server Authorizer Service) 是 AIRP 网络服务器侧的接入认证服务,回答"谁能进来";FAS 回答"谁在干什么"(见 FAS 审计工具安装指南)。二者互补,构成服务器安全的两道防线。

本文约定 SAS 的认证目标、认证流程与安全约束。字段级线格式以开源实现为准,见文末实现参考。

二、认证目标:双向对称

AIRP 的接入认证是双向且对称的,这是它与传统"客户端证明自己是用户"模式的关键区别:

  • 用户(客户端)必须持有有效的用户证书,否则无法登录任何服务器。
  • 服务方(台站)也必须先证明自己是合法持证台站——它的公告自带用户证书与数字签名,假台站过不了证书验证,在所有持证客户端眼里是"不存在的"。

若系统只验证客户端,攻击者完全可以搭建"钓鱼台站"诱骗通联流量。因此信任双向成立:你要通联别人,你得有证;你要开台让别人通联你,你也得有证。(见 4.0 技术模型)

三、临时通行证

客户端连接台站时,用自己的私钥签发一张临时通行证——一份"只对目标台站有效"的凭证。它有两个硬约束:

  • 仅可登录目标台站:通行证写死目标台站的身份,拿去连接其他台站无效。
  • 转发即废:即使半路被截走转发,也因目标身份对不上而失败。

它不是可以全网乱用的"万能票",而是一张只对当前这次连接、当前这个目标台站有效的临时凭证。

四、认证流程

1. 发现台站(官方列表 / 分享 / APRS-IS)→ 本地验证其用户证书与数字签名
2. 客户端构造临时通行证(绑定目标服务器身份)
3. 客户端向 EMQX 发起 MQTT CONNECT,携带用户名 + 密码载荷
4. EMQX 将用户名 + 密码经 HTTP 转发至 SAS(默认 :8080/auth)
5. SAS 执行证书链完整验证:
   - 用户证书链:Root CA → Intermediate CA → User Cert(caSig 验证)
   - 用户签名:载荷签名是否为证书公钥可验
   - 目标比对:通行证目标是否为本服务器
   - 有效期:iat ≤ nowUtc < exp
   - 吊销查询:按 certFingerprint 查询 CRL
6. SAS 通过 HTTP 返回允许 / 拒绝
7. 通过后,SAS 为连接注入 client_attrs 身份属性(呼号、UID 等),供 FAS 审计与服务器管理使用

认证依据中的 certFingerprint(SHA-256 证书 TBS 的确定性 CBOR 编码)定义见 APRS 报文格式 第 4.3 节。

五、特性与约束

  • 去中心:SAS 可离线运行,不依赖中心数据库,不存储用户信息列表;它仅凭证书链判定"这个用户是否真的持证"。
  • 身份属性:认证通过后注入的 client_attrs 是 FAS 身份比对审计的基础——未安装 SAS 的服务器没有身份属性,FAS 将无法正常审计(默认拉黑)。
  • 高危服务器:未安装 SAS/FAS 的服务器被视为「高危服务器」,已发生假冒呼号干扰事件。不理解 SAS/FAS 作用的,请勿搭建服务器。(见 FMO 服务器搭建指南)

六、实现参考

本文为机制层规范。用户名/密码载荷等字段级线格式以开源实现为准,如需权威字段定义请参考实现仓库;若有变更以协议维护方公告为准。