Пример cURL для доступа к аутентифицированному API Kraken

2716
aerique

Я пытался реализовать клиент для частного API Kraken ( https://www.kraken.com/help/api ), и, поскольку у меня возникли некоторые проблемы с этим, я пытался получить доступ к тому же самому API с CURL.

Тем не менее, я не могу заставить себя работать, и я думаю, что я не использую правильные инструменты командной строки для генерации хешей и дайджестов.

При доступе к частному 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"]}

Но независимо от того, какие перестановки я пробую, я получаю ошибку «Неверная подпись».

Эти перестановки включают, но не ограничиваются:

  • Base64, кодирующее значение API-Sign ( это делают все общедоступные клиенты Kraken),
  • верхний регистр, который должен быть закодирован в Base64,
  • опуская "/" перед путем URI,
  • оставив фактический номер nonce на передней панели SHA256.
4
Вы можете попробовать использовать одну из перечисленных реализаций API, например, python2, и добавить отладку, чтобы увидеть разницу. meuh 8 лет назад 1
Спасибо, это сделало проблему сразу очевидной. Как глупо, что я не пытался сделать это, прежде чем отправлять свой вопрос. aerique 8 лет назад 0

1 ответ на вопрос

5
aerique

Благодаря meuh я понял проблему. Поскольку я могу представить, что другие люди такие же глупые, как я, я отвечу на свой вопрос:

Проблема в том, что я использую строки вместо байтов. У меня нет времени, чтобы выяснить это для командной строки и cURL (возможно, кто-то еще хочет сделать это, и я приму этот ответ).

Для клиента, над которым я работал, вместо конкатенации /0/private/Balanceи шестнадцатеричной строки SHA256 353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3dя должен объединить байты для "/ 0 / private / Balance" ( 47 48 47 112 114 105 118 97 116 101 47 66 97 108 97 110 99 101) и SHA256 ("123nonce = 123") ( 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.

Редактировать:

Так как кто-то спросил в Твиттере, это реальные шаги, чтобы сделать это в командной строке:

  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 ==" is "« secret »" в кодировке 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) и в истории вашей оболочки!

Это идеальное решение, но мне нужно было добавить `-w 0` после второго` base64`, чтобы избежать разбиения вывода на две части (без `-w`, вывод форматируется в два столбца по 76 символов). Вы также забыли знак `$` перед скобками. Последняя команда для строки 3: `cat tmp.bin | openssl sha512 -binary -hmac $ (echo -n "wqtzZWNyZXTCuw ==" | base64 -d) | base64 -w 0` mountrix 7 лет назад 0
Забытый знак `$` потому что я использую рыбную раковину. Извините, я должен был принять панцирь Борна. aerique 7 лет назад 0