Verschlüsseln der Nachricht mit dem privaten RSA-Schlüssel (wie in OpenSSLs RSA_private_encrypt)

8

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 ).

    
artyom 02.08.2013, 07:59
quelle

3 Antworten

5

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 .

    
artyom 27.10.2013, 17:24
quelle
0

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.

    
quelle
0

Seit go 1.3 , können Sie dies einfach mit SignPKCS1v15

tun %Vor%

Siehe: Zypern

    
holys 20.04.2015 04:09
quelle

Tags und Links