NPS-Release

English Version 中文版

RFC 编号:NPS-RFC-0003 标题:Agent 身份三级保证等级(反爬 / 信任分流) 状态:Accepted(Phase 1 —— spec + .NET 参考类型已落地) 作者:Ori Lynn iamzerolin@gmail.com(LabAcacia) Shepherd:Ori Lynn(1.0 之前快速通道,见 spec/cr/README.cn.md创建日期:2026-04-21 最后更新:2026-04-25 接受日期:2026-04-25(1.0 之前快速通道;见 spec/cr/README.cn.md激活日期(首个参考 SDK 发版时填写,目标 v1.0-alpha.3) 取代 被取代于 影响的规范:NPS-3 NIP、NPS-2 NWP、spec/services/NPS-AaaS-Profile.md、spec/error-codes.md、spec/status-codes.md 影响的 SDK:.NET、Python、TypeScript、Java、Rust、Go —

NPS-RFC-0003:Agent 身份三级保证等级(反爬 / 信任分流)

1. 摘要

为 Agent 身份引入三个 保证等级——anonymous(L0)、attested (L1)、verified(L2),Node 可以在 NWM 里声明 min_assurance_level。 等级随 IdentFrame 传输,并作为 X.509 critical 扩展承载(见 NPS-RFC-0002 §4.1)。本 RFC 是 NPS 对 “我怎么知道来的请求是 Agent 不是爬虫” 的回答——协议不直接拦爬虫,但给 Node 一个原语: 要求可验证的 Agent 来源,然后可以按等级 计费 / 限速 / 拒绝。

2. 动机

本 RFC 回应 2026-04-20 的评审意见:

最核心的,如果我要接这套协议,最关心的反而是怎么做反爬?我怎么 知道来个请求不是爬虫而是 Agent 访问?

评论是对的:NPS 今天回答了 “这个 Agent 是谁”(NIP),但没回答 “这个 Agent 的身份有多可信”。NID 只是一个公钥——任何人,包括 爬虫农场,都可以生成一个 NID 并用它签请求。没有信任等级这个原语, Node 要么收所有匿名流量(对爬虫友好),要么手工维护白名单(运维 负担)。

X.509 世界用 EV / OV / DV + CA/B Forum baseline 解决了同类问题; 身份验真世界用 NIST SP 800-63 的 IAL1/2/3 解决了同类问题。我们 借用等级形状,不照搬人类身份的具体流程。

这带来的商业模型空间:AaaS 运营商可以把 L2 认证流量定价高于 L0;审计方可以要求受监管集成强制 L2;被爬虫困扰的站点可以在 热点 endpoint 上设 min_assurance_level: attested,同时不误伤 把 NID 升级过的合法 Agent。

3. 非目标

4. 详细设计

4.1 保证等级

等级 枚举 最低标准 典型用途
anonymous 0 自签名 NID;或 CA 签名但不绑身份 业余 Agent、开发/测试、”给我一个免费报价” 只读 endpoint
attested 1 被合规(RFC-0002)CA 签发的 NID;CA 已通过 ACME agent-01 证明私钥持有;CA 验证过联系邮箱 / 域名 大多数生产 Agent;限速分层默认
verified 2 L1 标准 + CA 核实了运营者法律身份:组织 NID 要公司注册,托管 Agent 要已知 AaaS 运营商的签字声明 受监管集成(金融、医疗)、付费高级档、高信任编排

“attested” 对 Node 真正的意义:CA 证明了有人既控制 NID 私钥 可以通过带外通道(ACME 账号邮箱、域名等)联系到——Agent 跑飞 时 CA 至少能邮件提醒运营者,最多直接吊销证书。L0 两个都给不了。

“verified” 再往上加的:CA 把 NID 和法律实体绑定。Node 可以 开发票、可以起诉、可以做合同级别的主张。

4.2 Wire 格式 / 帧变更

IdentFrame 新增一个字段:

字段 类型 必填 描述
assurance_level enum { anonymous, attested, verified } 当 NID 证书携带 id-nid-assurance-level 扩展(NPS-RFC-0002 §4.1)时,本字段 MUST 与之保持一致。Phase gate:Phase 1–2(当前)强制可选(SHOULD 检查并记录不匹配,MAY 强制执行);Phase 3 flag day(见 §8.1)起强制变为 MUST,违规返回 NIP-ASSURANCE-MISMATCH

证书是事实源;IdentFrame.assurance_level 是给不想解析证书就路由请求的服务端的冗余便利。

Phase 1–2(当前):Verifier SHOULD 校验证书扩展并记录不匹配,但 MAY 跳过强制执行。选择执行的实现 MUST 以 NIP-ASSURANCE-MISMATCH 关闭连接。

Phase 3(flag day,见 §8.1):Verifier MUST 校验证书扩展,若两者不一致 MUST 以 NIP-ASSURANCE-MISMATCH 关闭连接。这是完成升级的硬性截止点。

X.509 扩展升级(Phase 3 — 尚未生效):NPS-RFC-0002 定义 id-nid-assurance-level1.3.6.1.4.1.<PEN>.2.1)为非 critical。从 Phase 3 flag day 起,本 RFC 将其升级为 critical——旧 verifier MUST 拒绝带 critical 扩展的证书直到升级。这是故意的:一个启用了 min_assurance_level 的 Node MUST NOT 静默接收一个解析不了该扩展的 verifier。该升级在 Phase 1–2 尚未生效

4.3 Manifest / NWM 变更

NWM 新增一个顶层可选字段:

# /.nwm 片段
min_assurance_level: attested   # 默认:anonymous
auth:
  required_scopes: [...]
  min_assurance_level: verified  # per-action 覆盖(可选)

4.4 错误码

spec/error-codes.md 新增:

错误码 NPS 状态 说明
NIP-ASSURANCE-MISMATCH NPS-CLIENT-BAD-FRAME IdentFrame.assurance_level 与证书扩展不一致
NWP-AUTH-ASSURANCE-TOO-LOW NPS-AUTH-FORBIDDEN 请求的保证等级 < Node 的 min_assurance_level
NIP-ASSURANCE-UNKNOWN NPS-CLIENT-BAD-FRAME 证书扩展里的值超出已定义枚举

4.5 状态机 / 流程

拒绝路径(Node 启用 min_assurance_level: attested):

Agent (L0)                         Node
   │                                 │
   │── HelloFrame ─────────────────→ │
   │── IdentFrame (assurance=0) ───→ │
   │                                 │  check: 0 < 1 (attested)
   │ ←── ErrorFrame ──────────────── │  code: NWP-AUTH-ASSURANCE-TOO-LOW
   │     hint: "https://ca.../acme"  │  status: NPS-AUTH-FORBIDDEN
   │ ←── close                       │

升级路径是带外的:Agent 去合规(RFC-0002)CA 重新注册,拿到带 id-nid-assurance-level=attested 扩展的新证书,重试连接。

4.6 向后兼容性


5. 备选方案

5.1 二分 “认证 / 不认证”(两级)

砍掉 attested;只保留 unverified / verified

5.2 仅用声誉(跳过等级)

不要等级,直接让 Node 依赖 NPS-RFC-0004 声誉日志。

5.3 自由形式 CA 策略 OID

让 CA 按 X.509 certificatePolicies 自定义 OID,Node 在 NWM 里 枚举接受哪些 OID。

5.4 不动


6. 缺陷与风险


7. 安全性考量


8. 实施计划

8.1 阶段划分

阶段 范围 出口条件
1 .NET NIP 解析证书扩展;IdentFrame 带字段;NWM 解析 min_assurance_level;强制可选 单测绿;默认行为不变
2 6 SDK + 6 CA Server 全部支持;CA Server 通过 ACME 签 L1 证书;每家 CA 的 L2 签发流程出文档 跨 SDK interop:L0/L1/L2 矩阵绿
3 NWM 里设了 min_assurance_level 时默认启用强制;id-nid-assurance-level 扩展升级为 critical。Flag day:提前 ≥ 21 日历天在 NPS-Dev GitHub Discussions 公告;激活后,NIP-ASSURANCE-MISMATCH 强制为 MUST,不合规实现 MUST NOT 声称任何 NPS 合规级别 无回归;全 6 SDK 通过不匹配强制测试
4 启用了更严默认的 Node 移除 L0 默认 fast path N/A——运营方决定

8.2 SDK 覆盖矩阵

SDK 负责人 状态 备注
.NET Ori Lynn pending 参考实现
Python 待定 pending
TypeScript 待定 pending
Java 待定 pending
Rust 待定 pending
Go 待定 pending

8.3 测试计划

  1. L0 Agent 对 min_assurance_level: attested 的 Node → NWP-AUTH-ASSURANCE-TOO-LOW 拒绝。
  2. L2 Agent 对 min_assurance_level: anonymous 的 Node → 接受。
  3. 等级不一致(IdentFrame 说 L2,证书扩展说 L0)→ NIP-ASSURANCE-MISMATCH
  4. Per-action 覆盖:全局 L1、orders.create 要 L2 → L1 Agent 的 /invoke:orders.create 被拒,其他 action 通过。
  5. 证书无扩展对启用强制的 Node(Phase 3 后)→ 视为 L0, 等级 > 0 时拒绝。
  6. 证书里枚举值未知 → NIP-ASSURANCE-UNKNOWN

8.4 基准


9. 实测数据

暂无。在 Accepted 前提交:

指标 基线 提议 差值 方法
NWM 体积 无此字段 +~40 B +~40 B JSON 字节数
每请求开销 未启用 ~1 µs +1 µs BenchmarkDotNet

10. 未决问题


11. 未来工作


12. 参考


附录 A. 修订记录

日期 作者 变更
2026-04-21 Ori Lynn 初稿
2026-04-25 Ori Lynn 走 1.0 之前快速通道 Accept。已落地 spec:NPS-3 §5.1.1 保证等级 + IdentFrame assurance_level 字段、NPS-2 NWM min_assurance_level 字段、错误码 NIP-ASSURANCE-MISMATCH / NIP-ASSURANCE-UNKNOWN / NWP-AUTH-ASSURANCE-TOO-LOW。Phase 1 .NET 参考类型(NPS.NIP.AssuranceLevel 枚举、IdentFrame.AssuranceLevelNipVerifyContext.MinAssuranceLevelNeuralWebManifest.MinAssuranceLevel、相关错误/状态码常量)同时落地;verifier 主动强制保留为 opt-in(按 RFC §8.1:Phase 1 仅 parse,默认行为不变)。Phase 2(其余 5 SDK + 6 个 CA Server 通过 ACME 颁发 L1 证书 —— 依赖 RFC-0002)推迟到 v1.0-alpha.4。X.509 critical extension 翻转(§4.2)需与 RFC-0002 协调,尚未生效。AaaS-Profile §10 OQ-3(Gateway 强制 vs 后端节点强制)随 CR-0001 后续处理。