盲签名凭证与匿名访问资格
依据源码说明 AeroNyx VPN 盲签名 voucher 与 Blind Vault RFC 9474 admission,包括上线、重放、issuer 与隐私边界。
AeroNyx 在两条不同授权路径使用盲签名技术。两者都降低身份关联,但上线状态与重放保证不同。本页只描述当前 Rust main 的真实实现、受部署控制的能力,以及运营者绝不能从凭证推导的信息。
两条凭证路径
VPN 路径使用完成盲签名的资格验证 ClientHello。Blind Vault V2 使用 RFC 9474 凭证创建随机、自我认证的加密存储 lease。V1 Blind Vault admission 仍是可关联的一次性 bearer 兼容路径,不是 blind issuance。
| 凭证路径 | 当前状态 | 重放/兑换模型 |
|---|---|---|
| VPN ClientHello voucher | 已实现;reject_invalid 兼容上线 | VoucherVerifier 没有一次性 spend |
| Blind Vault V2 admission | Rust 已实现;受部署/配置控制 | 原子一次性 spend,精确 retry 幂等 |
| Blind Vault V1 admission | 仅兼容;新集成应使用 V2 | 原子一次性 spend,但 issuance 可关联 |
隐私不变量
隐私目标是在不把 issuance identity 交给 redeeming node 的前提下完成授权。Signer、entitlement backend、storage node 与 operator console 必须保持独立信任和数据边界;合并它们的 request-level 记录会破坏不可关联性。
- Redeeming node 验证服务权利但不接收 wallet/account identity。
- Blind signer 只接收 blinded bytes 与 public key ID,不接收 entitlement identity。
- Credential secret、token、randomizer、spend ID、lease ID 与 private key 不得进入 log 或 Nodeboard。
- Synthetic/aggregate counter 不得与 per-user traffic join。
- Wallet 的 blind-signing warning 与此无关:用户不是批准不可读 transaction。
VPN 握手 voucher
Client 发送有界的 AVCH trailing extension。Rust 只解析 credential fields,按 epoch 从配置的 issuer directory 获取公钥、缓存一小时,再验证 randomized SHA-384 RSA-PSS blind signature;不需要 wallet 或 account ID。
ClientHello fixed frame
+ magic: AVCH
+ voucher_length: u16 little-endian
+ voucher JSON (maximum 2048 bytes)
{
"token": "base64-final-credential-message",
"signature": "base64-finalized-blind-signature",
"msg_randomizer": "base64-32-byte-randomizer",
"epoch": "issuer-key-epoch"
}
只有 client 在 entitlement service 请求 signing boundary 前先 blind message,issuer flow 才是真正盲签名。对 identity-linked token 做普通签名并不等价。最终 token、signature、randomizer 与 epoch 都是 bearer secret,禁止记录。
VPN 上线边界
VPN 当前采用 reject_invalid 兼容模式:malformed 与密码学无效 voucher 会在握手前拒绝;完全 missing 的 voucher 仍允许,让旧版 client 退出。这不是 mandatory-voucher enforcement,文档不能如此宣称。
mode = reject_invalid
valid | invalid | missing | malformed | total
valid_ratio | invalid_ratio | missing_ratio | malformed_ratio
last_observation | last_error
VoucherVerifier 验证签名并记录聚合结果,但没有原子 consume VPN token 或一次性 redemption table。因此不能宣称节点强制一次性兑换;分享、重放、quota 与 expiry 仍属于 issuance/版本化协议问题。
Blind Vault V2 admission
Blind Vault V2 是更强的匿名 admission。Client 获取 node-signed issuer epochs、blind RFC 9474 message、经 entitlement backend 向隔离 issuer 获取签名、在本地 finalize,再发送到不变的 /api/vault/v1/lease。只有启用 Blind Vault 且 pinned issuer 有效时 public API 才工作。
GET /api/vault/v1/issuers
POST /api/vault/v1/lease
POST /api/vault/v1/put
POST /api/vault/v1/pull
POST /api/vault/v1/delete
Content-Type: application/vnd.aeronyx.blind-vault-v1
client blinds RFC 9474 admission message
-> entitlement backend authorizes issuance
-> isolated blind issuer signs blinded bytes only
-> client finalizes signature
-> node verifies active public epoch
-> atomic spend marker + random self-authenticating lease
-> ciphertext storage operations use lease-scoped keys/capabilities
Issuer 隔离与密钥轮换
私钥操作位于独立 aeronyx-blind-issuer process。Request 只有 scheme version、public issuer-key fingerprint 与有界 blinded RSA bytes,没有 account model、storage DB 或 redemption visibility;并提供 aggregate health 与可替换 software/HSM/KMS custody interface。
Public issuer epoch 包含 canonical public DER、稳定 SHA-256 key ID、有效时间与 maximum lease TTL。Runtime update 必须由另一把 pinned authority 验证,generation 单调增加、维持 active-epoch continuity 并原子持久化;rollback 或移除仍有效 epoch 会 fail closed。
原子 spend、幂等与重放
Blind Vault V2 在同一个 immediate SQLite transaction 验证 finalized credential 并创建 lease。Domain-separated spend ID 与 lease 一起 commit;已 spend 的 credential 不能创建第二个 lease,相同既有 lease 的精确 retry 仍然幂等。
V1 与 V2 共用一次性 spend table,但 scheme 分离:V1 保存 raw ticket identity、可以关联;V2 从 finalized credential 派生不可关联 spend ID。此原子 replay protection 属于 Blind Vault,不能套用到 VPN VoucherVerifier。
可观测性与 Nodeboard
Operator surface 只能展示聚合 validity、capacity、signer health 与粗粒度 failure bucket。last_observation 和 last_error 是运营 bucket,不能成为增加 token、wallet、lease、request 或 per-user 维度的理由。
允许的聚合证据:
- VPN
valid、invalid、missing、malformed总量与 ratio - issuer active-key、key-count、reload、capacity、rate、timeout 与 circuit-breaker counter
- Blind Vault 聚合 lease、live-object、ciphertext-byte、expiry 与 cleanup health
- 粗粒度 mode、epoch availability、last observation 与 privacy-boundary 状态
永不公开:
- raw voucher token、signature、randomizer、blinded message 或 spend ID
- wallet、account、payment、membership 或 social identity
- per-user redemption history、lease ID、object ID、capability 或 request ID
- client public IP、destination、DNS、route、message 或 browsing metadata
- issuer private key、backend provider error、ciphertext、plaintext 或 wallet-level traffic
威胁模型与限制
盲签名只降低 issuance 与 redemption 的关联,不消除所有 side channel。Network timing、region、capacity、client compromise、issuer over-collection、credential theft、collusion 与 traffic correlation 仍需 blind relay、encrypted payload、bounded logs、route diversity 与部署隔离。
- issuer-side collection 与 redemption timing 关联
- credential theft、sharing、resale 或 client storage compromise
- 在版本化 redemption policy 前的 VPN voucher replay
- 恶意或共谋的 issuer、backend、node 与 operator component
- timing、region、capacity 与 traffic-correlation side channel
- key-rotation rollback、inactive epoch 或 continuity 破坏
- 遥测悄悄从 aggregate health 扩张为 per-user history
源码关系图
源码刻意拆分 VPN verification、isolated signing、wire contract、Blind Vault admission、public API、configuration 与 health reporting;code review 应保持这些 ownership boundary。
| 层级 | 仓库路径 | 职责 |
|---|---|---|
| VPN verifier | crates/aeronyx-server/src/voucher_verifier.rs | 解析 AVCH、获取 epoch key、验证 finalized voucher 并记录聚合 rollout metrics。 |
| Blind signer | crates/aeronyx-blind-issuer/src/signer.rs | 拥有 identity-free RSA blind-signing policy 与 key-custody abstraction。 |
| Issuer API | crates/aeronyx-blind-issuer/src/api.rs | 提供 authenticated bounded signing、public epochs、pressure control 与 aggregate health。 |
| Wire contract | crates/aeronyx-core/src/protocol/blind_vault.rs | 定义 RFC 9474 admission message、key epoch、spend ID、frame 与 signature。 |
| Blind Vault service | crates/aeronyx-server/src/services/blind_vault.rs | 验证 V1/V2 admission 并原子 commit spend 与 lease。 |
| Blind Vault API | crates/aeronyx-server/src/api/blind_vault.rs | 以 coarse error 提供 issuers、lease、put、pull、delete routes。 |
| Blind Vault config | crates/aeronyx-server/src/config_blind_vault.rs | Pin issuer 与 update authority、限制 TTL、验证 monotonic rotation。 |
| Health 与 reporting | crates/aeronyx-server/src/api/vpn_health.rs and management/reporter.rs | 发布不含 voucher secret 或 wallet traffic 的节点聚合状态。 |
开发规则
只有 crypto semantics、rollout policy、one-time spend、observability、tests 与所有语言文档一致时才算完成。宁可采用较窄但真实的 claim,也不要把两套 credential system 合并成一句市场承诺。
- 命名、代码、telemetry 与文档都要分开 VPN 与 Blind Vault credential semantics。
- Missing credential 尚可接受时,不得宣称 VPN voucher 强制启用。
- 没有 atomic spend contract 时,不得宣称 VPN 一次性兑换。
- Blind signer 不得接收 account、wallet、lease、node 或 redemption context。
- 保持 epoch continuity、fail-closed authority verification 与 transaction atomicity。
- 只公开 aggregate health,永不记录 credential 或 identity dimension。
- 语义变更时同步 source tests、Nodeboard contracts 与所有翻译。