![访问经过身份验证的 Kraken API 的 cURL 示例](https://linux22.com/image/1506569/%E8%AE%BF%E9%97%AE%E7%BB%8F%E8%BF%87%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E7%9A%84%20Kraken%20API%20%E7%9A%84%20cURL%20%E7%A4%BA%E4%BE%8B.png)
我一直在尝试为 Kraken 私有 API 实现一个客户端(https://www.kraken.com/help/api) 并且由于我遇到了一些问题,我一直在尝试使用 cURL 访问相同的 API。
但是,我无论如何也无法让它工作,而且我想我可能没有使用正确的命令行工具来生成哈希值和摘要。
访问私有 API 时,需要在请求中添加以下标头:
API-Key = «key»
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded «secret»
在命令行上我执行以下步骤:
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=
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
结果(假设“密钥”和“秘密”有效):{"error":["EAPI:Invalid signature"]}
但无论我尝试哪种排列,我仍然收到“无效签名”错误。
这些排列包括但不限于:
- 对 API-Sign 值进行 Base64 编码(全部公开的 Kraken 客户端就是这样做的),
- 将要进行 Base64 编码的内容大写,
- 省略 URI 路径前面的“/”,
- 忽略 SHA256 前面的实际随机数。
答案1
感谢 meuh,我弄清楚了这个问题。因为我可以想象其他人和我一样愚蠢,所以我会回答我自己的问题:
问题是我使用的是字符串而不是字节。我没有时间弄清楚命令行和 cURL(也许其他人想这样做,我会接受这个答案)。
对于我正在处理的客户端,我不应该连接/0/private/Balance
SHA256 十六进制字符串,而应该连接“/0/private/Balance” ( ) 和 SHA256(“123nonce=123”) ( )353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d
的字节(这次显示为十进制值)。47 48 47 112 114 105 118 97 116 101 47 66 97 108 97 110 99 101
53 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 上询问,这些是在命令行上执行的实际步骤:
echo -n "/0/private/Balance" > tmp.bin
echo -n "123nonce=123" | openssl sha256 -binary >> tmp.bin
cat tmp.bin | openssl sha512 -binary -hmac $(echo -n "wqtzZWNyZXTCuw==" | base64 -d) | base64
(“wqtzZWNyZXTCuw==” 是 BASE64 编码的“«secret»”,这当然应该是你的秘密)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 历史记录中!