Я пытаюсь подписать токен 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 -- '+/=' '-_ '