盲签名凭证与匿名访问凭据
AeroNyx VPN 凭证如何让节点在不得知付款账户的情况下核实付款、reject_invalid 推出模式仍允许什么、节点和后端仍能看到什么,以及为什么 Blind Vault 准入已实现却未部署。
AeroNyx 使用盲签名凭证,使 VPN 节点能够核实某个连接已付费,而无需得知是哪个账户付的费。该机制目前已在 VPN 上线,运行于一种仍接受无凭证连接的兼容模式。第二条凭据路径——Blind Vault 准入——存在于节点软件中,但尚未部署,官方应用也未使用。
两条凭据路径
| 凭据路径 | 状态 | 兑换模型 |
|---|---|---|
| VPN 握手凭证 | 已上线。运行于 reject_invalid 兼容模式 | 节点检查签名。它不跟踪一次性花费 |
| Blind Vault V2 准入 | 已在节点中实现。尚未部署,官方应用也未使用 | 一次性花费与租约创建以原子方式一并记录 |
| Blind Vault V1 准入 | 仅用于兼容,位于同一个已禁用的组件中 | 一次性花费,但签发可与兑换关联起来 |
VPN 凭证如何签发
- 应用生成一个随机的 32 字节令牌,并使用 RSA 盲签名(RSABSSA-SHA384-PSS-Randomized,RFC 9474)在本地对其进行盲化。
- 应用只将盲化后的消息发送到 AeroNyx 后端的
/api/voucher/issue/。后端检查已登录账户是否具备权益,对盲化消息签名并返回签名。它从不会看到令牌。 - 应用在本地完成签名。最终的凭证(令牌、签名、消息随机化因子和密钥纪元)是一种不记名凭据,与签发请求没有关联。
按纪元分组的签发方公钥发布在:
GET https://api.aeronyx.network/api/voucher/issuer/keys/
节点如何检查凭证
应用会在 VPN ClientHello 之后附加一个凭证扩展:
ClientHello fixed frame
+ magic: AVCH
+ voucher_length: u16 little-endian
+ voucher JSON (maximum 2048 bytes)
{
"token": "base64-32-byte-token",
"signature": "base64-finalized-blind-signature",
"msg_randomizer": "base64-32-byte-randomizer",
"epoch": "issuer-key-epoch"
}
节点只解析这些字段。它从上述端点获取该纪元的签发方公钥,缓存一小时,并核验随机化的 SHA-384 RSA-PSS 签名。它不需要任何钱包或账户标识符。
推出模式:reject_invalid
- 格式错误和密码学上无效的凭证会在握手被接受之前遭到拒绝。
- 完全不带凭证的连接仍会被接受,以便旧版客户端继续工作。凭证的使用目前尚非强制。
- 节点不会记录已花费的凭证。只要凭证所属的签发方密钥纪元仍处于发布状态,节点就会在每次出示时接受有效凭证。共享、重放和配额限制由后端执行,而非由节点执行。
节点只上报汇总结果:
mode = reject_invalid
valid | invalid | missing | malformed | total
valid_ratio | invalid_ratio | missing_ratio | malformed_ratio
last_observation | last_error
节点能了解到你的什么信息
“节点从不会得知你的钱包身份”这一保证仅适用于凭证连接。
- 凭证连接(官方应用): 应用使用凭证和一个全新的临时握手密钥进行连接。节点可以核实付款,但无法将会话与你的钱包或 P2P 身份关联起来。
- 旧版连接: 使用其身份密钥而非凭证进行认证的客户端会在握手中发送该密钥。
在这两种情况下,节点都会将会话的握手公钥连同会话时间和字节数一起,通过一个名为 client_wallet 的字段上报给 AeroNyx 后端。对于凭证连接,该值是临时密钥。对于旧版连接,该值是客户端的身份密钥。节点运营者可以在 Nodeboard 中看到每个会话的流量和这些密钥。
凭证也无法隐藏其他所有信息。与任何 VPN 一样,节点仍能看到你的 IP 地址,并且作为出口,还能看到你的访问目的地和 DNS。当应用预留每日连接时,后端还会记录该账户在该时间进行了连接,但不会记录其使用了哪个节点。请参阅 VPN 对比 和 信任中心。
Blind Vault 准入(未部署)
Blind Vault 是一个节点组件,用于在匿名租约下存储由客户端加密的对象。其说明见 MemChain 与 Blind Vault。其准入设计如下:
- V2: 客户端对一条 RFC 9474 准入消息进行盲化。权益服务授权签发,由一个独立的签名进程(
aeronyx-blind-issuer)只对盲化后的字节签名。该进程没有账户数据库、存储,也看不到兑换情况。节点根据固定的公钥纪元核验最终凭据,并在一个 SQLite 事务中记录花费标记,同时创建一个随机、自认证的租约。已花费的凭据无法创建第二个租约。重试完全相同的请求会返回同一个租约。 - V1: 一种使用相同一次性花费表的不记名票据。节点会存储票据的身份标识,因此兑换可以与签发关联起来。它仅为兼容而保留。
只有当 Blind Vault 及其公共 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
当前状态:Blind Vault 未部署在生产节点上,官方应用不调用这些路由,AeroNyx 后端也没有 Blind Vault 权益端点。Blind Vault 不是备份、归档或存储产品,AeroNyx 也不提供任何此类产品。
可观测性
运营者界面只显示汇总的凭据健康状况:
- VPN 的
valid、invalid、missing和malformed总数及比率,以及推出模式 - 签发方密钥的可用性和粗粒度的失败分桶
它们从不显示凭证令牌、签名、随机化因子、盲化消息或花费 ID。会话级流量和握手密钥属于另一个单独的运营者视图,如上文所述。
威胁模型与局限
盲签名切断了签发请求与凭证之间的关联。但它们无法消除以下风险:
- 后端的签发或连接预留记录与节点的会话记录之间的时序关联,尤其是在同一方能同时看到两者时
- 节点能看到你的 IP 地址、访问目的地和 DNS
- 在密钥纪元处于发布状态期间凭证被盗、共享或转售,因为节点不强制执行一次性花费
- 无凭证的连接,在
reject_invalid模式下仍会被接受 - 签发方密钥轮换错误或客户端被攻破
源代码索引
| 层级 | 在节点仓库中的路径 | 作用 |
|---|---|---|
| VPN 验证器 | crates/aeronyx-server/src/voucher_verifier.rs | 解析 AVCH、获取纪元密钥、核验凭证并记录汇总结果 |
| 盲签名器 | crates/aeronyx-blind-issuer/src/signer.rs、api.rs | 为 Blind Vault V2 提供不涉及身份的 RSA 盲签名 |
| 线路协议约定 | crates/aeronyx-core/src/protocol/blind_vault.rs | RFC 9474 准入消息、密钥纪元和花费 ID |
| Blind Vault 服务与 API | crates/aeronyx-server/src/services/blind_vault.rs、api/blind_vault.rs | 准入、原子化的花费与租约、对象路由 |
| Blind Vault 配置 | crates/aeronyx-server/src/config_blind_vault.rs | 默认关闭;签发方固定与轮换规则 |
节点软件以 AGPL-3.0 许可在 github.com/AeroNyxNetwork/AeroNyx 开源。应用不是开源的。
<!-- faq:start -->常见问题
AeroNyx VPN 节点知道我用哪个钱包付的款吗?
对于官方应用所使用的凭证连接,不知道。节点核验的是盲签名凭证和临时握手密钥,两者都与你的钱包没有关联。使用其身份密钥连接的旧版客户端则会向节点暴露该密钥。
一张凭证可以多次使用吗?
可以。节点根据凭证所属纪元的已发布密钥核验签名,但不保留已花费凭证的列表。配额由后端执行。
连接时必须使用凭证吗?
目前还不是。节点会拒绝格式错误或无效的凭证,但仍接受不带任何凭证的连接,以便旧版客户端继续工作。
凭证签发方密钥发布在哪里?
它们按纪元分组发布在 https://api.aeronyx.network/api/voucher/issuer/keys/。节点会将这些密钥缓存一小时。
应用中可以使用 Blind Vault 吗?
不可以。Blind Vault 准入已在节点软件中实现,但默认禁用、尚未部署,官方应用也未使用。AeroNyx 不提供任何备份或存储产品。
<!-- faq:end -->