cURL-Beispiel für den Zugriff auf authentifizierte Kraken-API

2741
aerique

Ich habe versucht, einen Client für die Kraken Private API ( https://www.kraken.com/help/api ) zu implementieren. Da ich einige Probleme damit habe, habe ich versucht, auf das gleiche zuzugreifen API mit cURL.

Ich kann es jedoch nicht für mein Leben bekommen, damit es funktioniert, und ich denke, ich benutze möglicherweise nicht die richtigen Befehlszeilen-Tools, um die Hashes und Digests zu generieren.

Beim Zugriff auf die private API müssen der Anfrage die folgenden Header hinzugefügt werden:

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

In der Kommandozeile mache ich folgende Schritte:

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

Ergebnis: (stdin)= 353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d

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

Ergebnis: (stdin)= 6f19f8f058b0e6dc835692840ccdebc1c415f00d42b75b3d3c21ef5fd43f006e30cc9b51c63aba3268a534bf68978d60d2362bffd31c8125553fb8ec41b2f64d

  • echo -n "6f19f8f058b0e6dc835692840ccdebc1c415f00d42b75b3d3c21ef5fd43f006e30cc9b51c63aba3268a534bf68978d60d2362bffd31c8125553fb8ec41b2f64d" | base64

Ergebnis:

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

Ergebnis (vorausgesetzt, gültiger «Schlüssel» und «geheimes»): {"error":["EAPI:Invalid signature"]}

Aber egal welche Permutationen ich versuche, ich bekomme immer den Fehler "Ungültige Signatur".

Diese Permutationen umfassen, sind jedoch nicht beschränkt auf:

  • Base64-Codierung des API-Sign-Werts (dies ist bei allen öffentlich verfügbaren Kraken-Clients der Fall)
  • Uppercasing, was Base64-codiert sein soll,
  • das '/' vor dem URI-Pfad weglassen,
  • Lassen Sie die tatsächliche Nonce-Nummer an der Vorderseite des SHA256 aus.
4
Sie könnten versuchen, eine der aufgeführten aktiven API-Implementierungen wie die Python2-Version zu verwenden, und ein paar Debuggen hinzufügen, um herauszufinden, wo der Unterschied liegt. meuh vor 7 Jahren 1
Danke, das hat das Problem sofort offensichtlich gemacht. Ein bisschen dumm, dass ich das nicht probiert habe, bevor ich meine Frage gestellt habe. aerique vor 7 Jahren 0

1 Antwort auf die Frage

5
aerique

Dank an mich habe ich das Problem herausgefunden. Da ich mir vorstellen kann, dass andere Leute so dumm sind wie ich, beantworte ich meine eigene Frage:

Das Problem ist, dass ich Zeichenfolgen anstelle von Bytes verwende. Ich habe keine Zeit, um es für die Befehlszeile und cURL herauszufinden (vielleicht möchte das jemand anderes tun und ich akzeptiere diese Antwort).

Für die Auftraggeber ich arbeite, statt verketten /0/private/Balanceund die SHA256 Hexstring 353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3dich sollte die Bytes für „/ 0 / private / Balance“ (verketten 47 48 47 112 114 105 118 97 116 101 47 66 97 108 97 110 99 101) und 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) (dargestellt als Dezimalwerte diesmal ).

Gleiches gilt für den SHA512 HMAC.

Bearbeiten:

Da jemand auf Twitter gefragt hat, sind dies die eigentlichen Schritte, um dies auf der Kommandozeile zu tun:

  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 ==" ist "" secret "" BASE64-codiert, dies sollte natürlich Ihr Geheimnis sein)
  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

Wie Sie oben sehen können, wurde bei der ursprünglichen Frage nur der -binarySchalter verwendet.

Hinweis: Ihr API-Schlüssel und das Geheimnis werden in der Befehlszeile (sichtbar mit ps aux) und in Ihrem Shell-Verlauf angezeigt!

Diese Lösung ist perfekt, aber ich musste nach dem zweiten `base64 'ein' -w 0 'hinzufügen, um die Aufteilung der Ausgabe in zwei zu vermeiden (ohne' -w 'wird die Ausgabe in zwei Spalten mit je 76 Zeichen formatiert). Sie haben auch ein "$" - Zeichen vor der Klammer vergessen. Abschließender Befehl für Zeile 3: `cat tmp.bin | openssl sha512 -binary -hmac $ (echo -n "wqtzZWNyZXTCuw ==" | base64 -d) | base64 -w 0` mountrix vor 6 Jahren 0
Das vergessene "$" - Zeichen ist, weil ich die Fischmuschel verwende. Ich hätte eine Bourne-Schale annehmen müssen, sorry. aerique vor 6 Jahren 0