运行并配置 PSSP Broker
Broker 是适用于 Windows/Linux/macOS 的独立服务。它认证客户端、检查 ACL、保存有限的内存主题缓存、分发不透明字节,并且从不解析媒体或应用程序负载。
请参阅 Broker 配置,了解认证管理监听器、允许服务范围、SQLite 隔离、workerID、共享 worker 组、广播客户端和 WebService 环境变量。Broker 运行时,应用必须调用管理监听器,不能打开 SQLite 或调用修改型 CLI。
在哪里查找以及如何运行 pssp-broker
Cargo 包和可执行文件名为 pssp-broker,但其源代码目录名为 broker/。检出仓库不会自动把可执行文件安装到 shell 的 PATH。因此,即使 Broker 源代码和本地构建的二进制文件存在,直接运行 pssp-broker list-principals ... 仍可能提示“找不到命令”。
| 内容 | 从仓库根目录看到的位置或命令 | 使用场景 |
|---|---|---|
| Broker 源代码 | broker/ | 包含 Rust 源代码、Broker 配置示例、部署定义和包清单。 |
| 由 Cargo 运行 | cargo run -p pssp-broker -- <参数> | 推荐用于仓库开发。Cargo 会在需要时构建包,并把 -- 后的全部内容传给 Broker。 |
| 调试可执行文件 | target/debug/pssp-brokerWindows: target\debug\pssp-broker.exe | 由 cargo build -p pssp-broker 或 cargo run -p pssp-broker 生成。 |
| 发布可执行文件 | target/release/pssp-brokerWindows: target\release\pssp-broker.exe | 由 cargo build --release -p pssp-broker 生成;部署时使用此构建产物。 |
| 已安装的可执行文件 | pssp-broker | 仅当文件已安装或复制到 PATH 中的目录后才能直接使用;服务也可以配置明确的绝对路径。 |
对于本地构建的调试版 Broker,以下形式等效:
# 让 Cargo 构建并运行
cargo run -p pssp-broker -- --help
cargo run -p pssp-broker -- list-principals --config broker/config/pssp.example.toml
# 在 macOS/Linux 上直接运行构建产物
./target/debug/pssp-broker --help
./target/debug/pssp-broker list-principals --config broker/config/pssp.example.toml
# Windows PowerShell
.\target\debug\pssp-broker.exe --help
以 pssp-broker 直接开头的命令假定部署版本已安装,并且可执行文件位于 PATH 中。在仓库根目录工作时,请把该前缀替换为 cargo run -p pssp-broker --、./target/debug/pssp-broker,或相应的发布版/Windows 路径。可在 macOS/Linux 上用 command -v pssp-broker 检查,在 PowerShell 中用 Get-Command pssp-broker 检查。
快速开始:本地可信网络
- 从仓库根目录构建或检查工作区。
cargo check --workspace - 初始化 Broker 自主管理的 SQLite 数据库。使用随附开发配置并以仓库根目录为工作目录时,会创建
data/pssp-broker.sqlite3。命令会安全地提示输入密码。cargo run -p pssp-broker -- setup --config broker/config/pssp.example.toml \ --bootstrap-client-id pssp-admin --bootstrap-username admin - 运行配置。
cargo run -p pssp-broker -- serve --config broker/config/pssp.example.toml
本地配置使用直接 TCP/UDP。SQLite 中的密码以 Argon2id 哈希保存,但网络上的凭据与负载可被读取。绝不能暴露给不可信网络。
选择传输模式
| 使用场景 | TLS | PSSP AES | 显式传输标志 | 结果 |
|---|---|---|---|---|
| 生产环境 | true | true | false | TLS 1.3 封装 TCP。每会话新的 AES-256-GCM 密钥保护 PSSP 记录。UDP 绑定后受 AES 保护。 |
| 无证书的受保护网络 | false | true | false | 客户端固定 Broker X25519 公钥。临时 X25519 + HKDF 在加密认证前派生新 AES 密钥;对称密钥不经过 TCP。 |
| 可信/私有网络 | false | false | true | 直接 TCP QoS 1 和 UDP QoS 0。无 TLS/AES;认证后 Broker 签发临时的仅内存 UDP 关联令牌。 |
TLS 和 PSSP AES 可以分别启用。只有两者均关闭时才需要明文选项 transport.allow_insecure_tcp_udp = true;只要 TLS 或 AES 已启用,Broker 就会拒绝该明文选项。
# 仅用于可信/私有网络模式
[tls]
enabled = false
[encryption]
enabled = false
[transport]
allow_insecure_tcp_udp = true
配置参考
本地测试从 broker/config/pssp.example.toml 开始;安全部署从 broker/config/pssp.production.example.toml 开始。
| 区段 | 键 | 说明 |
|---|---|---|
[listener] | tcp_bind、udp_bind | TCP QoS 1/控制和 UDP QoS 0 监听地址。两者默认均为 0.0.0.0:6688。 |
[tls] | enabled | 使用 TLS 1.3 封装 TCP。需要 certificate_file 和 private_key_file。 |
[encryption] | enabled | 独立于 TLS 启用 PSSP AES-256-GCM 会话记录。关闭 TLS 时还需配置 static_private_key,并在每个客户端中固定其派生的 X25519 公钥。 |
[transport] | allow_insecure_tcp_udp | 仅无 TLS/无 AES 的直接 TCP/UDP 模式所需的显式启用。启用 TLS 或 AES 时必须为 false。 |
[limits] | max_connections | 最大并发 TCP 会话数;默认 2,000。 |
[limits] | max_header_bytes、max_payload_bytes | 最大 PSSP JSON 头和不透明负载大小;默认分别为 1,024 和 65,536 字节。 |
[limits] | max_outbound_queue_bytes | 每会话发送容量。慢订阅者不会阻塞发布者;其在线投递可能会被丢弃,但保留的主题数据仍可用于重放。 |
[limits] | idle_timeout_seconds | 会话关闭前允许的最大 TCP 静默时长。 |
[limits] | subscriber_resume_ttl_seconds | Broker 为离线订阅者保留 resume 确认游标的时长。 |
[topic_defaults] | max_bytes、max_messages、max_age_seconds | 每主题内存保留限制。淘汰会向受影响订阅者产生 GAP 通知。 |
[storage] | sqlite_path | Broker 自主管理的 SQLite 数据库位置,用于主体、Argon2id 密码哈希、ACL 和凭据审计事件。相对路径以 Broker 进程的工作目录为基准;安装服务建议使用绝对路径。 |
[storage] | unix_owner_user、unix_owner_group | 可选的 Unix 服务身份;修改型 CLI 命令完成后,由该身份拥有受保护的 SQLite 目录、数据库和旁路文件。两项必须同时设置或同时省略;账号与组必须已存在,setup 还必须有权应用该所有权。 |
[storage] | auth_cache_seconds、auth_cache_entries | 有界认证缓存的生命周期和条目数。账户变更在缓存过期后生效。 |
数据库创建与文件访问权限
storage.sqlite_path 是准确信息;Broker 不会始终把 SQLite 放在某个固定的操作系统目录。开发配置选择 data/pssp-broker.sqlite3。随附的 Linux 生产配置只有在保留模板值时才选择 /var/lib/pssp/pssp-broker.sqlite3,Windows 生产配置则选择 C:\ProgramData\PSSP\pssp-broker.sqlite3。其他部署应选择受保护的绝对路径,并为 setup、管理和 serve 使用同一份配置。
setup 会创建缺失的父目录与数据库、初始化结构、创建引导管理员,并授予该管理员对 # 的发布和订阅权限。在 Unix 上,数据库及已有 SQLite 旁路文件权限会限制为 0600。如果配置了 unix_owner_user 和 unix_owner_group,setup 及后续修改型管理命令还会把目录和文件分配给该服务身份,并将父目录限制为 0700。
Unix 所有权与权限模式只决定 Broker 进程能否打开 SQLite,并不授权 PSSP 客户端。客户端主题访问权来自 SQLite 中的 ACL 记录,使用 grant-acl 和 revoke-acl 管理;通过 create-principal 新建的主体一开始没有任何主题授权。
凭据和主题 ACL
SQLite 是唯一认证来源。Broker 不会调用 WebService,客户端仅发送标准 AUTH 记录。账户需要手动创建;Broker 不会自动生成客户端 ID、用户名或密码。
创建设备账户
- 选择稳定的客户端 ID 和用户名,然后创建主体。CLI 会安全地提示输入新密码,输入时不会显示字符。
pssp-broker create-principal --config /etc/pssp/pssp.toml \ --client-id ox-device-OXRC-001 \ --username device-OXRC-001 \ --principal-kind device - 授予通过 QoS 0 UDP 发布设备心跳的权限。
pssp-broker grant-acl --config /etc/pssp/pssp.toml \ --client-id ox-device-OXRC-001 --username device-OXRC-001 \ --action publish \ --topic-filter '/api/devices/OXRC-001/heartbeat' - 授予通过 QoS 1 TCP 发布音频的权限。
pssp-broker grant-acl --config /etc/pssp/pssp.toml \ --client-id ox-device-OXRC-001 --username device-OXRC-001 \ --action publish \ --topic-filter '/api/devices/OXRC-001/audio/chunks' - 授予订阅 QoS 1 命令的权限。
pssp-broker grant-acl --config /etc/pssp/pssp.toml \ --client-id ox-device-OXRC-001 --username device-OXRC-001 \ --action subscribe \ --topic-filter '/api/devices/OXRC-001/commands' - 检查账户和实际 ACL 条目。
pssp-broker list-principals --config /etc/pssp/pssp.toml pssp-broker list-acls --config /etc/pssp/pssp.toml \ --client-id ox-device-OXRC-001 --username device-OXRC-001 - 在客户端中配置完全相同的客户端 ID、用户名和刚才输入的密码,以及 Broker 地址和固定的仅 AES 公钥。
Broker 只保存 Argon2id 密码哈希。list-principals 可以显示客户端 ID 和用户名,但任何命令都无法显示原始密码。如果密码丢失,请轮换密码并安全地更新客户端。
账户生命周期
轮换丢失或过期的密码;CLI 会安全地提示输入替换密码:
pssp-broker rotate-password --config /etc/pssp/pssp.toml \
--client-id ox-device-OXRC-001 --username device-OXRC-001
撤销权限时,需要指定最初授予的准确操作和主题过滤器:
pssp-broker revoke-acl --config /etc/pssp/pssp.toml \
--client-id ox-device-OXRC-001 --username device-OXRC-001 \
--action publish \
--topic-filter '/api/devices/OXRC-001/audio/chunks'
不带 --enabled 可禁用账户;再次添加 --enabled 可重新启用:
# 禁用
pssp-broker set-principal-enabled --config /etc/pssp/pssp.toml \
--client-id ox-device-OXRC-001 --username device-OXRC-001
# 重新启用
pssp-broker set-principal-enabled --config /etc/pssp/pssp.toml \
--client-id ox-device-OXRC-001 --username device-OXRC-001 --enabled
仅在账户不再需要时永久删除账户及其所有 ACL:
pssp-broker delete-principal --config /etc/pssp/pssp.toml \
--client-id ox-device-OXRC-001 --username device-OXRC-001
非交互式配置应使用 --password-file 或 --password-stdin,不要把密码直接写入 Shell 历史。认证和 ACL 变更会在 storage.auth_cache_seconds 后生效(默认 30 秒),或在重启 Broker 后立即生效。
发布条目必须使用具体主题。ACL 条目和订阅可以用 + 匹配一个路径段,并用最后一个 # 匹配后代主题。除非存在匹配的允许规则,否则拒绝访问。
主题缓存、确认与资源边界
发布者路径
QoS 1 发布者提供 publisherSessionId + publisherSequence。Broker 只接受一个序号一次,将负载放入主题环,返回 PUBACK,再扇出至订阅者。
订阅者路径
订阅者仅在其应用接受数据后发送 MSGACK。对于持久集成,请在 ACK 前持久化或可靠排队。用相同订阅者标识重连并使用 resume。
主题内存仍然是易失性的:Broker 重启会删除主题环、去重状态、会话密钥、订阅、UDP 关联和恢复游标。只有主体、密码哈希、ACL 和凭据审计事件持久化到 SQLite。
安全部署
- 构建发布二进制文件。
cargo build --release -p pssp-broker - 将适合平台的生产模板复制到受保护的位置。把
storage.sqlite_path设置为该部署使用的受保护绝对路径;不要假定仓库开发路径或其他操作系统的路径。 - 在 Unix 上,先创建服务账号与组,再将
unix_owner_user和unix_owner_group同时设置为该身份。在 Windows 上,为任务计划程序所用身份保护选定的 ProgramData 目录。 - 配置 TLS,或通过
pssp-broker generate-aes-only-private-key生成仅 AES 模式的 X25519 私钥,并保持allow_insecure_tcp_udp = false。 - 在仅 AES 模式中,用
pssp-broker aes-only-public-key --private-key-file /protected/path/private-key派生客户端要固定的公钥;也可以省略输入选项使用隐藏提示。私钥仅保存在受保护的 Broker 配置或密钥文件中,通过可信客户端预置通道分发公钥。 - 使用最终配置运行
pssp-broker setup;它会创建并保护 SQLite 和引导管理员。然后在启动服务前创建最小权限主体,只授予所需 ACL。密码由 CLI 安全提示输入,自动化可使用受保护的文件或标准输入。 - 安装所提供的服务定义,并确保它使用同一个配置路径:systemd 使用
broker/deploy/pssp-broker.service,launchd 使用broker/deploy/io.oxrecorder.pssp-broker.plist,Windows 使用broker/deploy/Install-PsspBrokerTask.ps1。
Windows 后台任务
使用 Rust MSVC 工具链构建,以 config/pssp.windows.production.example.toml 作为受保护的配置模板,然后在提升权限的 PowerShell 中运行安装程序:
.\broker\deploy\Install-PsspBrokerTask.ps1 `
-BrokerPath 'C:\Program Files\PSSP Broker\pssp-broker.exe' `
-ConfigPath 'C:\ProgramData\PSSP\pssp.toml'
PowerShell 安装程序会创建以本地系统账户(LocalSystem)身份在启动时运行、并带失败重试设置的任务计划程序(Task Scheduler)后台任务。普通控制台二进制文件不能在没有服务控制管理器(Service Control Manager)包装器的情况下直接安装为 Windows 服务。使用 -Action Uninstall 删除任务。仅为获准网络添加 TCP 6688 和 UDP 6688 的 Windows 防火墙规则。
只允许获准网络访问 QoS 1/控制的 TCP 6688 和 QoS 0 的 UDP 6688。如果不需要 UDP 心跳,请在网络边界阻止 UDP。
运行行为与故障排查
启动诊断、数据库权限恢复、完整的仅 AES 设置和更全面的错误目录,请参阅 PSSP 故障排查指南。
| 现象 | 含义/操作 |
|---|---|
| 流量开始前客户端即被拒绝 | 启用 TLS 时,检查客户端 TLS 选项和证书名称匹配。关闭 TLS 的 AES 模式中,将准确的固定 Broker X25519 公钥粘贴到客户端。 |
authentication_failed | 确认准确的客户端 ID/用户名存在且已启用、密码为最新,并在近期变更后等待认证缓存过期。 |
publish_not_authorized 或 subscribe_not_authorized | 使用 Broker CLI 修改该主体在 SQLite 中的 ACL。 |
收到 GAP | 请求的主题数据已超出配置的内存限制。请从应用存储恢复,或经过容量评估后增大保留量。 |
| UDP 绑定/ping 失败 | 保持 TCP 已连接,允许 UDP 6688 通过防火墙/NAT,并使用相同 Broker 主机/端口。先完成所选 TLS 和/或 AES 会话建立。 |
| 相同客户端 ID 存在两个会话 | 这是设计行为。每个连接都有唯一的 Broker 连接 ID、会话密钥、出站队列和 UDP 关联。 |