You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Kraken REST API时出现EAPI:Invalid signature错误求助

Kraken API "EAPI:Invalid signature" 错误排查及私有接口疑问解答

一、"EAPI:Invalid signature" 错误排查

咱们一步步拆解你的代码问题,核心问题出在签名生成环节,还有几个细节需要修正:

  • 签名返回值错误(最关键):你在getMessageSignature函数最后返回的是hmac对象本身,但Kraken要求的是计算完成的base64格式签名字符串,也就是你已经算好的hmac_digest。把return hmac;改成return hmac_digest;,这是导致签名无效的核心原因。
  • 前端环境依赖不兼容:你用了require('crypto')和require('qs'),这俩是Node.js专属模块,如果你的代码是在浏览器里跑(因为用了jQuery的$.ajax),浏览器不支持require语法,也没有内置crypto模块。解决办法是:
    • 用crypto-js这类浏览器兼容的加密库替代Node.js的crypto
    • 引入qs的浏览器版本,或者用原生URLSearchParams序列化参数(注意要按参数名字母顺序排序,Kraken要求的)
  • Nonce类型转换问题:计算哈希时你直接用nonce + message,这里nonce是数字类型,直接拼接可能出现隐式转换异常,最好显式转成字符串:nonce.toString() + message
  • 参数序列化一致性:确保签名里的message和你实际POST的参数完全一致。Kraken要求参数按字母顺序排序后序列化,qs.stringify默认会按键名排序,这点没问题,但要确认没有额外参数混入请求数据里。

修正后的getMessageSignature函数(Node.js环境下)示例:

function getMessageSignature(path, request, secret, nonce){
  const crypto = require('crypto');
  var qs = require('qs');
  // 把nonce转为字符串避免类型问题
  const nonceStr = nonce.toString();
  // 强制按参数名排序序列化,符合Kraken要求
  const message = qs.stringify(request, { sort: (a, b) => a.localeCompare(b) });
  const secretBuffer = Buffer.from(secret, 'base64');
  
  const hash = crypto.createHash('sha256');
  const hashDigest = hash.update(nonceStr + message).digest('binary');
  
  const hmac = crypto.createHmac('sha512', secretBuffer);
  const hmacDigest = hmac.update(path + hashDigest, 'binary').digest('base64');
  
  return hmacDigest; // 返回正确的签名字符串
}

二、调用Kraken私有接口是否要求账户有资金?

完全不需要。只要你的API密钥拥有对应接口的权限(比如调用DepositMethods需要开启Deposit权限),哪怕账户里一分钱都没有,也能正常调用这类查询性质的私有接口。像getDepositMethods只是返回你的账户支持的存款方式,和账户余额无关。

内容的提问来源于stack exchange,提问作者Oscar Ordoñez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:03:50