Ich versuche, Chef-API-Client in Go zu implementieren, bleibe aber dabei, eine korrekte RSA-Signatur für die Anfragekopfzeile zu erstellen. Laut Dokumentation :
Ein kanonischer Header wird mit dem privaten Schlüssel signiert, der vom Client-Computer verwendet wird, von dem die Anfrage gesendet wird, und wird auch mit Base64 codiert.
Der folgende Ruby-Aufruf von OpenSSL::PKey::RSA.private_encrypt()
befindet sich in mixlib-authentication
gem code , es verwendet OpenSSL-Bindungen , private_encrypt()
Methodenaufrufe RSA_private_encrypt
openssl-Funktion .
Leider kann ich in Go's Standardbibliothek keine passende Funktion finden; crypto/rsa
sieht eng aus, implementiert jedoch nur konventionelle Verschlüsselungsmethoden: Verschlüsselung mit dem Schlüssel public , Hash-Signatur mit privatem Schlüssel. OpenSSL RSA_private_encrypt
macht das Gegenteil: Es verschlüsselt (kleine) Nachricht mit privatem Schlüssel (ähnlich wie eine Signatur aus Nachrichtenhash).
Dieses "Signieren" kann auch mit diesem Befehl erreicht werden:
%Vor% Gibt es native Go-Bibliotheken, die dasselbe Ergebnis wie OpenSSLs RSA_private_encrypt
erreichen, oder kann Cgo diese Funktion nur über die OpenSSL-Bibliothek aufrufen? Vielleicht vermisse ich etwas. Meine Idee war, den Client ohne Abhängigkeiten zu implementieren.
Ich bin ein Go-Neuling, also bin ich mir nicht sicher, ob ich in crypto/rsa
-Modulquellen eintauchen kann.
Gefunden die ähnliche Frage , aber die Antwort , um SignPKCS1v15
zu verwenden, ist offensichtlich falsch (diese Funktion verschlüsselt den Hash der Nachricht, nicht die Nachricht selbst ).
Mit großer Hilfe der Golang-Community wurde die Lösung gefunden:
Ursprünglicher Code, der auf Ссылка von Alex veröffentlicht wurde (siehe Mailingliste ).
Ich habe die Überprüfung der Eingabe-Blockgröße hinzugefügt, wie in Abschnitt 8 von rfc2313 beschrieben: Ссылка
Hier ist der Code:
%Vor%Update: In Go 1.3 können wir eine native Unterstützung für diese Art der Signierung erwarten, siehe das geeignete Commit .
Willkommen zu den Freuden von openssl ... Das ist eine unglaublich schlecht benannte Funktion. Wenn du im Ruby-Code herumstocherst, ruft er diese openssl-Funktion auf.
Beim Lesen der Dokumentation wird der Puffer tatsächlich mit dem privaten signiert Schlüssel und nicht verschlüsseln.
BESCHREIBUNG
Diese Funktionen behandeln RSA-Signaturen auf niedriger Ebene.
RSA_private_encrypt () signiert die flen-Bytes von (normalerweise ein Nachrichtenauszug mit einer Algorithmuskennung) unter Verwendung des privaten Schlüssels rsa und speichert die Signatur in in. muss auf RSA_size (RSA) Bytes des Speichers zeigen.