用于访问经过身份验证的 Kraken API 的 cURL 示例

aer*_*que 6 bash curl api openssl base64

我一直在尝试为 Kraken 私有 API ( https://www.kraken.com/help/api )实现一个客户端,因为我遇到了一些问题,我一直在尝试访问它带有卷曲的 API。

但是,我终生无法让它工作,我想我可能没有使用正确的命令行工具来生成哈希和摘要。

访问私有 API 时,需要将以下标头添加到请求中:

API-Key = «key»
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded «secret»
Run Code Online (Sandbox Code Playgroud)

在命令行上,我执行以下步骤:

  • echo -n "123nonce=123" | openssl sha256

结果: (stdin)= 353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d

  • echo -n "/0/private/Balance353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d" | openssl sha512 -hmac $(echo -n "wqtzZWNyZXTCuw==" | base64 -d)

结果: (stdin)= 6f19f8f058b0e6dc835692840ccdebc1c415f00d42b75b3d3c21ef5fd43f006e30cc9b51c63aba3268a534bf68978d60d2362bffd31c8125553fb8ec41b2f64d

  • echo -n "6f19f8f058b0e6dc835692840ccdebc1c415f00d42b75b3d3c21ef5fd43f006e30cc9b51c63aba3268a534bf68978d60d2362bffd31c8125553fb8ec41b2f64d" | base64

结果:

NmYxOWY4ZjA1OGIwZTZkYzgzNTY5Mjg0MGNjZGViYzFjNDE1ZjAwZDQyYjc1YjNkM2MyMWVmNWZk
NDNmMDA2ZTMwY2M5YjUxYzYzYWJhMzI2OGE1MzRiZjY4OTc4ZDYwZDIzNjJiZmZkMzFjODEyNTU1
M2ZiOGVjNDFiMmY2NGQ=
Run Code Online (Sandbox Code Playgroud)
  • curl -X POST -H "Accept: application/json" -H "API-Key: «key»" -H "API-Sign: NmYxOWY4ZjA1OGIwZTZkYzgzNTY5Mjg0MGNjZGViYzFjNDE1ZjAwZDQyYjc1YjNkM2MyMWVmNWZkNDNmMDA2ZTMwY2M5YjUxYzYzYWJhMzI2OGE1MzRiZjY4OTc4ZDYwZDIzNjJiZmZkMzFjODEyNTU1M2ZiOGVjNDFiMmY2NGQ=" -d "nonce=123" https://api.kraken.com/0/private/Balance

结果(假设有效的 «key» 和 «secret»): {"error":["EAPI:Invalid signature"]}

但无论我尝试哪种排列,我都会收到“无效签名”错误。

这些排列包括但不限于:

  • Base64 编码 API-Sign 值(所有公开可用的 Kraken 客户端都这样做),
  • 大写任何要被 Base64 编码的东西,
  • 省略 URI 路径前的“/”,
  • 去掉 SHA256 前面的实际随机数。

aer*_*que 6

感谢meuh我想通了这个问题。因为我可以想象其他人和我一样愚蠢,所以我将回答我自己的问题:

问题是我使用的是字符串而不是字节。我没有时间弄清楚命令行和 cURL(也许其他人想要这样做,我会接受那个答案)。

对于我正在处理的客户端,我应该连接“/0/private/Balance”()和 SHA256(“123nonce=123”)()(这次显示为十进制值)的字节,而不是连接/0/private/Balance和 SHA256 十六进制字符串)。353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d47 48 47 112 114 105 118 97 116 101 47 66 97 108 97 110 99 10153 63 157 249 42 177 213 229 175 224 107 183 209 187 66 168 239 102 84 182 51 217 72 24 0 122 234 251 175 3 202 61

SHA512 HMAC 也是如此。

编辑:

由于有人在 Twitter 上询问,这些是在命令行上执行此操作的实际步骤:

  1. echo -n "/0/private/Balance" > tmp.bin
  2. echo -n "123nonce=123" | openssl sha256 -binary >> tmp.bin
  3. cat tmp.bin | openssl sha512 -binary -hmac $(echo -n "wqtzZWNyZXTCuw==" | base64 -d) | base64(“wqtzZWNyZXTCuw==”是“«秘密»”BASE64编码,这当然应该是你的秘密)
  4. curl -X POST -H "Accept: application/json" -H "API-Key: «key»" -H "API-Sign: «output-from-step-3»" -d "nonce=123" https://api.kraken.com/0/private/Balance

正如您在上面看到的,原始问题中被遗忘的一件事是使用-binary开关。

注意:您的 API 密钥和秘密将最终出现在命令行(用 可见ps aux)和您的 shell 历史记录中!