Генерация подписи 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 -- '+/=' '-_ '