ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

锁死你的RPC网关:eRPC认证机制JWT、SIWE钱包签名与IP白名单完全指南

锁死你的RPC网关:eRPC认证机制JWT、SIWE钱包签名与IP白名单完全指南 锁死你的RPC网关eRPC认证机制JWT、SIWE钱包签名与IP白名单完全指南【免费下载链接】erpceRPC — fault-tolerant evm rpc proxy项目地址: https://gitcode.com/gh_mirrors/erpc1/erpceRPC是一个容错型 EVM RPC 代理fault-tolerant EVM RPC proxy而它的认证机制是安全的第一道闸门通过secret 静态令牌、JWT 签名令牌、SIWE 以太坊钱包签名、IP 白名单五种策略任意组合把每个请求挡在上游提供商之前还能把每个身份绑定到独立的速率限制预算让付费用户和匿名流量永不同锅。 开放的 RPC 端点会被爬虫和机器人迅速发现别人的脚本会烧掉你的提供商预算。本文带你从零配置一套「锁死」的 RPC 网关。为什么你的 RPC 端点必须上认证一个没有认证的 EVM RPC 端点等于把上游 API 额度挂在公网上️流量被白嫖匿名调用者可以无限制地发请求你的 Alchemy / Infura 额度瞬间见底⚖️没有公平性一个失控的客户端能饿死所有其他调用者无法归因出问题时你不知道流量是谁发的eRPC 的认证层在请求触达任何上游之前就完成身份校验每个身份API key、JWT 用户、钱包地址、IP都会被记录到日志和 Prometheus 标签中实现可观测 可限流的双重收益。eRPC 认证策略速览5种方式任选eRPC 在每个项目上声明一组有序策略projects[*].auth.strategies按声明顺序逐个匹配第一个通过的策略获胜并返回一个User{Id, RateLimitBudget}供下游限流使用。策略适用场景凭据载体源码入口secret服务间后端调用X-ERPC-Secret-Token头 /?secretauth/strategy_secret.gojwt面向用户的 SaaS 应用Authorization: Bearer tokenauth/strategy_jwt.gosiweDApp 的钱包登录EIP-4361?signature?messageauth/strategy_siwe.gonetwork内网服务免凭据放行客户端 IP 白名单auth/strategy_network.godatabase动态 API key 管理数据库查表PG/DynamoDB/Redis…auth/strategy_database.go凭据提取有固定优先级?token→?secret→X-ERPC-Secret-Token→Authorization: Basic→Authorization: Bearer→?jwt→ SIWE 头/参数 → 都没有则落入network策略。也就是说没带任何凭据的请求会自动走到 IP 白名单逻辑——这是无凭据流量的「兜底通道」实现见 auth/http.go。第一步用 secret 策略 5 分钟锁住网关最简单的后端间门禁一行配置即可projects: - id: main auth: strategies: - type: secret rateLimitBudget: backend-tier # 把这个身份绑定到独立限流预算 secret: id: backend value: ${MY_SECRET_VALUE}客户端在请求头带上X-ERPC-Secret-Token: 你的token或 URL 参数?secret即可通过。⚠️ 两个注意点secret使用非常量时间字符串比较只适合私有网络的服务间调用面向公网请直接选jwt或database同一个项目可以声明多个 secret每个id会作为独立身份出现在 Prometheus 标签里方便按客户端看 RPS第二步JWT 验证、算法白名单与密钥轮换面向用户的应用推荐 JWT。eRPC 支持 RSA / EC / HMAC 密钥并支持kid密钥轮换和远程 JWKS 拉取- type: jwt jwt: verificationKeys: rsa-2024: file:///etc/erpc/public-2024.pem rsa-2025: file:///etc/erpc/public-2025.pem # 新增 kid旧 key 自然过期后删除 allowedAlgorithms: [RS256] # 必须限制否则存在算法混淆攻击风险 allowedIssuers: [https://auth.myapp.com] allowedAudiences: [https://rpc.myapp.com] rateLimitBudgetClaimName: rlm # 从 token 的 rlm 声明提取限流预算几个关键设计千人千额零额外配置把限流预算 ID 写进 token 的rlm声明claim name 可自定义默认就是rlm一个策略就能给成千上万的用户分配不同配额密钥轮换零停机轮换时往verificationKeys里加一个新kid旧 token 继续用旧密钥验证直到自然过期远程 JWKS配置verificationJwksUrl必须为 http/https 绝对地址后启动时拉取并在后台按间隔默认 1h刷新用户身份取自 token 的sub声明直接成为User.Id⚠️最大陷阱verificationKeys为空时是拒绝一切deny-all而不是放行一切——报错信息为no suitable verification key found。密钥选择逻辑见 auth/strategy_jwt.go。第三步SIWE 钱包签名——让 DApp 免密码登录对于钱包用户eRPC 支持EIP-4361 Sign-In-With-Ethereum前端用钱包签名一段标准 SIWE 消息eRPC 验证 EIP-191 签名后恢复出的以太坊地址小写直接作为 User.Id——天然的去中心化身份体系。- type: siwe siwe: allowedDomains: [app.example.com] # 必须显式配置至少一个 rateLimitBudget: dapp-tier验证流程是四步流水线解析 EIP-4361 消息 → EIP-191 签名验证 → 域名白名单精确匹配 → 时效检查ValidNow()全部逻辑集中在 auth/strategy_siwe.go。⚠️ 两个「静默失败」allowedDomains为空或缺失 拒绝所有 SIWE 请求且不会给出配置层面的提示客户端必须同时提供signature和message或X-Siwe-MessageX-Siwe-Signature头只给一个会被静默当作无凭据请求落入 network 策略第四步IP 白名单——内网流量的免凭据兜底内部服务不带 token 也可以放行但仅限你信任的网段# network 策略放最前面它是无凭据流量的兜底 - type: network network: allowedIPs: [192.168.1.10] # 精确 IP allowedCIDRs: [10.0.0.0/8, 172.16.0.0/12] allowLocalhost: true # 无条件放行 127.0.0.1 / ::1 ipAsUser: true # 每个 IP 独立身份进 Prometheus 标签 rateLimitBudget: internal-tier # 外部调用者继续用命名 secret - type: secret secret: id: external-service value: ${EXTERNAL_SECRET_TOKEN}匹配顺序为localhost → 精确 IP → CIDR首个命中即通过见 auth/strategy_network.go。ipAsUser的取舍false默认时整个 CIDR 段共享一个身份10.0.0.0/8true时每个 IP 独立成用户适合在监控面板上按来源 IP 排查异常流量。第五步database 策略——API key 动态管理与故障逃生用户量上规模后把静态 secret 换成数据库动态 key增删 key、吊销 key无需重新部署。支持 PostgreSQL、DynamoDB、Redis、内存、gRPC 五种连接器默认查erpc_auth表记录格式为 JSON{ userId: string (必填), enabled: true, rateLimitBudget: budget-id (可选) }生产级内建件进程内 Ristretto 正向缓存默认 1h TTL、5 秒硬编码负缓存、singleflight 去重、指数退避重试以及连接器宕机熔断器——数据库挂了以后每秒只放一个真实探测请求其余直接走快速路径- type: database database: connector: driver: postgresql postgresql: connectionUri: ${DATABASE_URL} cache: ttl: 1m failOpen: enabled: true userId: emergency-failopen # 紧急流量的身份 rateLimitBudget: emergency-tier # 熔断期流量也受限流约束⚠️ 权衡缓存 TTL 拉大到 1m 会把撤销 key 的生效时间推迟到最长 1 分钟failOpen务必配上限额预算否则数据库故障期会变成「免费午餐」。把每个身份绑到独立限流预算认证策略的rateLimitBudget与全局rateLimiters预算配合实现「认证即配额」rateLimiters: budgets: - id: per-user rules: - method: * maxCount: 200 period: 1s预算解析优先级用户级DB 记录字段 / JWT 声明 / 策略级 策略级rateLimitBudget 无预算全放行。超限返回 HTTP 429且指标erpc_rate_limits_total带originauth标记能和其他层限流区分开。监控认证谁失败了、为什么失败认证生效后两个核心指标值得进你的 Grafana 面板erpc_auth_failed_total按strategy/reasoninvalid_api_key、disabled_key、db_timeout…拆分失败原因erpc_rate_limits_total看哪个身份在撞预算天花板每个认证通过的身份User.Id都会流入日志上下文和 Prometheus 标签配合上面的监控面板你可以精确回答「这一波流量是谁发来的」。新手避坑清单 ⚠️不配 auth 全放行。strategies为空时注册表直接放行一切请求认证是「opt-in」network 策略建议放最前——它是无凭据兜底放后面会被其他策略的失败路径遮蔽JWT 不配allowedAlgorithms会允许算法混淆攻击如拿 RS256 公钥伪造 HS256务必显式限制secret比较非时序安全公网端点请用jwt/database健康检查认证healthCheck.auth禁止设rateLimitBudget——该作用域的注册表没有限流器注册表会直接空指针 panicadmin.auth不配会导致管理端点始终报错内部部署也要配一个策略条目里只放一个子配置块secret:、jwt:等多个块会按secret → database → jwt → siwe顺序静默覆盖type关键源码与文档位置认证核心与策略匹配循环auth/registry.go、auth/authorizer.go五类策略实现auth/strategy_secret.go、auth/strategy_jwt.go、auth/strategy_siwe.go、auth/strategy_network.go、auth/strategy_database.goJWKS 拉取与刷新auth/jwks.go认证配置类型与默认值common/config.go、common/defaults.go官方认证文档docs/pages/config/auth.mdx「锁死端点」用例页docs/pages/use-cases/lock-it-down.mdx按「secret 起步 → JWT/SIWE 面向用户 → network 兜内网 → database 上规模」的路线升级你的 RPC 网关就从「谁都能用」变成「每个身份都清晰、每一分额度都可控」。【免费下载链接】erpceRPC — fault-tolerant evm rpc proxy项目地址: https://gitcode.com/gh_mirrors/erpc1/erpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表