Generieren einer JWT RS256-Signatur mit OpenSSL

Generieren einer JWT RS256-Signatur mit OpenSSL

Ich versuche, ein JWT-Token mit dem RS256-Algorithmus zu signieren openssl. Nehmen Sie das folgende Beispiel-Token:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

ProRFC 7518, RS256 bedeutet, dass die verwendete Signatur „RSASSA-PKCS1-v1_5 mit SHA-256“ ist. Meines Wissens nach würde die folgende Verwendung openssl dgstausreichen:

# generate the key
openssl genrsa -out private.pem 2048

# generate the signature
echo 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' | \
openssl dgst -sha256 -sign private.pem -binary | \
openssl base64 | \
tr -- '+/=' '-_ '

Der Versuch, jwt.io zur Überprüfung zu verwenden, führt jedoch zu einer ungültigen Signatur. Darüber hinaus führt die Verwendung von jwt.io zum Generieren einer Signatur mit demselben privaten Schlüssel zu einer völlig anderen Signatur.

Was mache ich falsch? Ist das openssl dgstdie richtige Art, dieses Token zu signieren?

Antwort1

echogibt seine Argumente als Zeile aus, d. h. es fügt ein Zeilenumbruchzeichen hinzu. Auf einigen Systemen oder Shells -nwird dies unterdrückt, aberprintf '%s' 'string'ist zuverlässig korrekt.

# generate the key
openssl genrsa -out private.pem 2048

# generate the signature
printf '%s' 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' | \
openssl dgst -sha256 -sign private.pem -binary | \
openssl base64 | \
tr -- '+/=' '-_ '

verwandte Informationen