Генерация подписи JWT RS256 с помощью openssl

Генерация подписи JWT RS256 с помощью openssl

Я пытаюсь подписать токен JWT с помощью алгоритма RS256, используя openssl. Возьмем следующий пример токена:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

ЗаRFC7518, RS256 означает, что подпись используется как "RSASSA-PKCS1-v1_5 с использованием SHA-256". Я понимаю, что следующее использование openssl dgstподойдет:

# 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 -- '+/=' '-_ '

Однако попытка использовать jwt.io для проверки приводит к недействительной подписи. Более того, использование jwt.io для генерации подписи с использованием того же закрытого ключа дает совершенно другую.

Что я делаю не так? Как openssl dgstправильно подписать этот токен?

решение1

echoотображает свои аргументы как строку -- то есть добавляет символ новой строки. В некоторых системах или оболочках -nэто подавляется, ноprintf '%s' 'string'достоверно верно.

# 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 -- '+/=' '-_ '

Связанный контент