问题现象与本文范围
量化、网格、自写脚本时,常见返回类似:
- 权限不足 / invalid permissions / not authorized
- 签名错误 / invalid signature
- 时间戳过期 / request expired
- IP 不在白名单
- API key 不存在或已禁用
本文给 可执行的排查顺序 与安全原则,不提供可被滥用的攻击性内容,也不替代各所最新 API 文档中的签名算法细节。
专文与清单:
注册:
先分清:四类鉴权失败
| 类型 | 典型含义 | 优先检查 |
|---|---|---|
| 权限不足 | Key 角色不够或资源未授权 | 勾选权限、产品线、子账户 |
| 签名错误 | 鉴权串与服务器计算不一致 | Secret、拼串、编码、passphrase |
| 时间问题 | 时间戳超出窗口 | NTP、单位秒/毫秒 |
| 网络身份 | IP/密钥状态 | 白名单、Key 是否删除 |
把日志里的 完整错误码 + message 存下来,比只看交易软件红字「下单失败」有效得多。
权限不足:矩阵怎么读
创建 API Key 时,平台通常分权限开关(名称因所而异):
- 读取(余额、行情、成交查询)
- 交易(下单、撤单)
- 提现(高风险,默认应关)
- 有的还有 转账/万向划转、期权、经纪商 等细分
常见「以为开了其实没开」
- 只开了现货交易,脚本却打合约地址
- 开了交易未开读取,部分客户端初始化失败
- 统一交易账户/组合保证金权限与旧 endpoint 不匹配
- 子账户 Key 不能操作主账户资产
- 只读 Key 被复制到下单机器人配置里
- 权限更改后 旧连接未重建,仍用缓存的权限视图
处理步骤
- 登录官网 API 管理页,打开该 Key 详情
- 对照机器人所需:行情、私有查询、下单、撤单
- 关闭一切当前策略用不到的权限(尤其提现)
- 保存后 生成新 Secret 的场景 按页面提示;改权限是否要重建 Key 以平台为准
- 重启客户端,用最小测试单验证(极小数量、限价远离市场也可先测撤单权限)
签名错误:系统化排查
签名错误不一定是「密钥错了」,但密钥与拼串仍是大头。
检查清单
-
API Key / Secret 是否完整
- 复制时是否少字符、多了空格换行
- 是否把 Key 和 Secret 填反
- 是否用了另一账户的密钥
-
Passphrase / 密码短语(若平台有)
- 创建 Key 时自设的短语,不是登录密码
- 部分库字段名不同,漏传即失败
-
签名字符串内容
- method、path、query、body 的拼接顺序必须与官方文档一致
- content-type、是否 JSON 紧凑格式,严格按文档
- 不要对已签名内容再二次 URL 编码搞错层
-
时间戳
- 秒 vs 毫秒
- 是否与服务器时间同步
- 是否重复使用过期的预签名
-
请求是否被中间层改写
- 错误的代理改了 body
- 网关重复附加参数
-
库与示例版本
- 官方 SDK 大版本升级后签名头名称可能变化
- 第三方过时教程对已下线 API 仍签名
建议验证方式
- 先调一个 只读私有接口(如余额)
- 再调 撤单/查询订单
- 最后才 下单
这样可区分「签名全错」与「签名对但交易权限不足」。
具体算法以 OKX / 币安 官方开发者文档为准,本文不展开逐步公式,避免与文档更新不一致。
IP 白名单与设备环境
绑定 IP 是重要安全能力,也是报错来源:
| 情况 | 现象 | 处理 |
|---|---|---|
| 未加当前出口 IP | 鉴权失败 | 查询公网出口,写入白名单 |
| 多机房故障转移 | 间歇失败 | 列入所有会出口的 IP |
| 动态家庭宽带 | 隔日失败 | 换固定 IP/云主机或按风险权衡 |
| 团队共享一个 Key | 难追责 | 一人一 Key 一 IP 段 |
同时注意:
- 不要在浏览器插件、共享网盘明文存 Secret
- CI 日志勿打印签名头与 Secret
- 开发机与生产机使用不同 Key
与「账户能登录但不能 API 交易」的区别
有时网页可交易,API 不行:
- 账户完成了 KYC/风险问卷,但 API 另有产品限制
- 合约开通状态仅对网页生效的错觉——多数应对 API 同样生效,若不然看是否打错环境(实盘/模拟)
- 使用了 模拟盘 Key 打实盘域名 或相反
- 账户处于限制状态(仅允许平仓等),API 返回权限类错误
账户级限制需结合站内风控与安全文判断,而不是只重建 Key。
分场景处置
场景 A:新创建 Key,首次连接即签名错误
- 99% 复制错误或 passphrase 错
- 检查系统时间
- 用官方 SDK 样例打通只读接口
场景 B:运行数月后突然权限不足
- 是否有人在网页改了 Key 权限
- 是否平台权限模型升级要重新勾选
- 是否策略新加了合约/杠杆接口
- 是否 Key 被轮换,配置文件仍旧
场景 C:仅提现或划转类报错
- 显式关闭提现权限的 Key 不能走提现 endpoint——这是预期安全行为
- 资金划转是否要单独权限
- 不要为图方便给交易机器人开通提现
场景 D:多子账户策略
- 每个子账户独立 Key
- 配置里 accountId/subName 与 Key 绑定一致
- 主账户 Key 若支持指定 sub 参数,勿漏传
场景 E:云函数/Serverless 出口 IP 漂移
- 固定 NAT 网关 IP 再白名单
- 或使用交易所允许的安全方案(以官方为准)
- 避免「关闭白名单」作为长期方案
安全基线(权限排错时也不要破坏)
- 最小权限:能读不写、能交易不提现
- IP 白名单:能开尽开
- 密钥轮换:人员变动、怀疑泄露时删除重建
- 分离:研究 Key / 生产 Key 分开
- 监控:异常高额下单、异常 IP 尝试
- 泄露响应:删 Key → 查提现 → 改密码 2FA → 审设备
展开阅读:
推荐排查顺序(可当 runbook)
- 保存完整错误码与响应 body
- 判断四类:权限 / 签名 / 时间 / IP
- 网页确认 Key 仍存在且未冻结
- 核对权限开关与产品线(现货/合约等)
- 核对 IP 白名单与当前出口
- 校验本地时间 NTP
- 重拷 Secret 与 passphrase,注意空白符
- 官方 SDK 打通只读私有接口
- 再测下单;仍失败则对照官方错误码表
- 怀疑泄露则删除 Key 并走安全清单
日志里建议保留 / 禁止保留
可保留: 时间、endpoint、权限类错误码、订单 id(若有)、所用 Key 的备注名(非 Secret)。
禁止写入日志或工单公开区: Secret、完整签名、2FA、短信验证码、passphrase。
向官方排查时,通过 App/官网工单,提供 Key 备注名与时间窗即可,不要主动贴出 Secret。
平台文档差异
OKX 与币安在 请求头字段名、签名拼串、是否 passphrase、错误码体系 上不同。迁移策略或双所套利时,不要共用一套签名函数硬套。以各所开发者中心当前页为准;站内文只补安全与排错框架。
小结表
| 报错倾向 | 动作 |
|---|---|
| 权限不足 | 勾选交易权限、对产品线、子账户绑定 |
| 签名错误 | Secret/拼串/passphrase/SDK 版本 |
| 时间相关 | NTP、秒毫秒、窗口 |
| IP 相关 | 白名单与固定出口 |
| 突然全失败 | Key 是否被删、账户限制、环境盘 |
| 只要提现类失败 | 保持关闭并改用官方提现安全流程 |
API 报错大半是配置与权限问题;把「能下单」建立在最小权限和可审计密钥管理上,而不是一次性开满权限图省事。
本文不构成投资建议。接口权限、签名算法、限频与错误码均以交易所官方开发者文档及账户实时设置为准。