盲簽名憑證與匿名存取資格
依照源碼說明 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 與所有翻譯。