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

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

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

Согласно RFC 7518, 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 -- '+/=' '-_ '
Другие вопросы по тегам