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 dgst
ausreichen:
# 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 dgst
die richtige Art, dieses Token zu signieren?
Antwort1
echo
gibt seine Argumente als Zeile aus, d. h. es fügt ein Zeilenumbruchzeichen hinzu. Auf einigen Systemen oder Shells -n
wird 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 -- '+/=' '-_ '